|
Динамический массив структур, Создание / удаление |
|
|
|
May 5 2009, 09:25
|
Участник

Группа: Новичок
Сообщений: 21
Регистрация: 9-01-09
Пользователь №: 43 070

|
К примеру у меня есть структура и я хочу работать с динамическим массивом, правильно ли будет: Код typedef struct { DWORD Debug; char *Oerr; char Oerr_num; WORD Data_FC; char Nfunc; } SProba; ... int num = 3; SProba *dat = (SProba*) malloc(sizeof(SProba) * num); SProba *elem = &dat[1]; elem->Oerr = (char*) malloc(10); .... for(i = 0; i < num; i++) free(dat[i]->Oerr; free(dat);
|
|
|
|
|
 |
Ответов
|
May 5 2009, 12:05
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142

|
Простите, а разве нельзя? Типа было под него выделено ни сколько памяти, и освободиться ни сколько.... Если это неправильно, то уже есть в структуре размер массива Oerr: Oerr_num. Освобождая проверять его... Код for(i = 0; i < num; i++) { if ( dat[i]->Oerr_num > 0 ) { free(dat[i]->Oerr); } } free(dat); Но это непринципиально, интересно, почему нельзя освобождать память если её не выделяли.
|
|
|
|
|
May 5 2009, 13:14
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Злодей @ May 5 2009, 15:05)  Простите, а разве нельзя? Типа было под него выделено ни сколько памяти, и освободиться ни сколько.... Нельзя. Вам не было "выделено нисколько памяти" - вам память не выделялась вообще. В free() нужно передавать указатель на то же место, который вернул вам malloc(). Дело в том, что перед выделенным вам участком менеджер памяти хранит служебную информацию об этом участке. Когда вы вызываете free(), менеджер использует эту информацию для возврашения освобожденной памяти в кучу и объединения ее с другими свободными участками. Если вы вызовете free() с каким-то другим адресом - совершенно случайная информация перед этим указателем разрушит данные менеджера кучи. Единственное исключение - допускается вызов free с указателем равным 0, в таком случае он просто ничего не делает. У вас в примере память выделяется только для одного элемента из трех. Поэтому вы должны либо выделить память и для остальных, либо обнулить остальные указатели.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
YChebisheva Динамический массив структур May 5 2009, 09:25 Oldring Цитата(YChebisheva @ May 5 2009, 13:25) f... May 5 2009, 09:32 YChebisheva Oldring, описалась. Понятно, что скобку не закрыла... May 5 2009, 11:15 Палыч Цитата(YChebisheva @ May 5 2009, 14:15) А... May 5 2009, 11:46 Палыч Цитата(Злодей @ May 5 2009, 15:05) интере... May 5 2009, 12:28 _Pasha Цитата(YChebisheva @ May 5 2009, 12:25) К... May 5 2009, 13:22 Палыч Цитата(_Pasha @ May 5 2009, 16:22) но тол... May 5 2009, 13:31  _Pasha Цитата(Палыч @ May 5 2009, 16:31) Разве m... May 5 2009, 15:07 YChebisheva Ребята это я виновата, Вас всех запутала.
Понятно,... May 5 2009, 14:02 Палыч Цитата(YChebisheva @ May 5 2009, 17:02) М... May 5 2009, 14:17 YChebisheva Как понимаю особой разницы malloc и calloc нет, пр... May 6 2009, 06:31 _Pasha Цитата(YChebisheva @ May 6 2009, 09:31)
... May 6 2009, 06:35 YChebisheva у меня ещё вопрос возник по части объема, которая ... May 6 2009, 08:28 Палыч Цитата(YChebisheva @ May 6 2009, 11:28) и... May 6 2009, 09:07  _Pasha Если мы(Вы) имеем дело с С99 и gnu99, можно смело ... May 6 2009, 10:25   zltigo Цитата(_Pasha @ May 6 2009, 13:25) Если м... May 6 2009, 10:54    _Pasha Цитата(zltigo @ May 6 2009, 13:54) fast, ... May 6 2009, 15:13 Злодей Здесь сказано: ЦитатаРазмер структуры выравниваетс... May 6 2009, 09:50 YChebisheva А как определить, какой у меня компилятор, если пи... May 6 2009, 10:47 YChebisheva с типами разобралась.
А может лучше объявить всю с... May 6 2009, 12:04 zltigo Цитата(YChebisheva @ May 6 2009, 14:56) А... May 6 2009, 12:09 YChebisheva .
А как определить, какой у меня компилятор, если... May 6 2009, 12:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|