URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8329
[ Назад ]

Исходное сообщение
"помогите разобраться с памятью в си"

Отправлено fa , 26-Июн-09 16:25 
Всем привет
Вот зашел в тупик. Как такое может быть:

В стандартной библиотеке есть функция getpwuid, которая возвращает указатель на вот такую струкруру:

struct passwd {
   char   *pw_name;       /* user name */
   char   *pw_passwd;     /* user password */
....
          };

Насколько я понимаю под строки pw_name, pw_passwd функция должна выделить память (malloc(сколько-то)), и затем, после того как указатель на структуру мне больше не нужен, я должен эту память вернуть (free(my_pointer->pw_name); free(my_pointer->pw_passwd); ...). Однако, на деле получается, что не должен. Если вызываю free - valgrind ругается. Если не вызываю - все ок. Подскажите, где просчет?


Содержание

Сообщения в этом обсуждении
"помогите разобраться с памятью в си"
Отправлено phpcoder , 26-Июн-09 16:38 
>Насколько я понимаю под строки pw_name, pw_passwd функция должна выделить память

Не обязательно. Эти указатели могут ссылаться на статически выделенную память. И судя по тому, что есть ещё ф-ция getpwuid_r() именно так и происходит -- возвращается указатель на области статической памяти.


"помогите разобраться с памятью в си"
Отправлено me , 26-Июн-09 18:16 
>[оверквотинг удален]
>
>struct passwd {
>   char   *pw_name;      
> /* user name */
>   char   *pw_passwd;     /*
>user password */
>....
>          };
>
>Насколько я понимаю под строки pw_name, pw_passwd функция должна выделить память (malloc(сколько-то)), и затем, после того как указатель на структуру мне больше не нужен, я должен эту память вернуть (free(my_pointer->pw_name); free(my_pointer->pw_passwd); ...). Однако, на деле получается, что не должен. Если вызываю free - valgrind ругается. Если не вызываю - все ок. Подскажите, где просчет?

       The return value may point to static area, and may be overwritten  by  subsequent  calls  to
       getpwent(3), getpwnam(), or getpwuid().