The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
помогите разобраться с памятью в си, !*! 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, 16:38 , 26-Июн-09 (1)
    >Насколько я понимаю под строки pw_name, pw_passwd функция должна выделить память

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

  • помогите разобраться с памятью в си, !*! me, 18:16 , 26-Июн-09 (2)
    >[оверквотинг удален]
    >
    >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().




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру