The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"помогите разобраться с памятью в си"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"помогите разобраться с памятью в си"  +/
Сообщение от fa email(??) on 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 ругается. Если не вызываю - все ок. Подскажите, где просчет?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "помогите разобраться с памятью в си"  +/
Сообщение от phpcoder email(??) on 26-Июн-09, 16:38 
>Насколько я понимаю под строки pw_name, pw_passwd функция должна выделить память

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "помогите разобраться с памятью в си"  +/
Сообщение от me (??) on 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().

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




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

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