реклама на сайте
подробности

 
 
> Динамический массив структур, Создание / удаление
YChebisheva
сообщение May 5 2009, 09:25
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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);
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Злодей
сообщение May 5 2009, 12:05
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 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);


Но это непринципиально, интересно, почему нельзя освобождать память если её не выделяли.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 5 2009, 13:14
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 06:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016