2015-05-06 4 views
0

Я искал что-то вроде этого, прежде чем я писал этот пост и не смог найти ..Избавление массив STRUCT в C

у меня есть:

struct foo* fooArray= malloc(sizeof(*fooArray)*5); 
struct foo* newFoo = malloc(sizeof(*newFoo)); 
fooArray[0]=*newFoo; 
struct foo* newFoo2 = malloc(sizeof(*newFoo2)); 
fooArray[1]=*newFoo2; 

Как освободить каждого из элементов в fooArray?

free(&fooArray[0]); // Gives me error 
free(fooArray[0]); // Doesn't compile 
+0

Почему вы назначаете указатель в 'newFoo'? Я думаю, что вы хотите выделить структуру 'foo' вместо, как в' malloc (sizeof (foo)) '. – Dacav

+0

Почти ничего из этого кода не имеет смысла – harold

+0

Do: 'free (fooArray);'. 'free()' ожидает указатель, возвращаемый функциями семейства malloc. Не знаю, каково ваше намерение со всеми этими назначениями ... Если это то, что вы похожи на код, тогда у вас еще много проблем ... –

ответ

4

Прежде всего этот код

struct foo* fooArray= malloc(sizeof(*fooArray)*5); 
struct foo* newFoo = malloc(sizeof(*newFoo)); 
fooArray[0]=*newFoo; 
struct foo* newFoo2 = malloc(sizeof(*newFoo2)); 
fooArray[1]=*newFoo2; 

является недействительным.

Я думаю, что вы имеете в виду следующее

struct foo** fooArray= malloc(sizeof(*fooArray)*5); 
struct foo* newFoo = malloc(sizeof(newFoo)); 
fooArray[0]=newFoo; 
struct foo* newFoo2 = malloc(sizeof(newFoo2)); 
fooArray[1]=newFoo2; 

Чтобы освободить только эти два выделенных элементов newFoo и новый Foo2 вы можете написать, например

free(fooArray[0]); 
free(fooArray[1]); 

fooArray[0] = NULL; 
fooArray[1] = NULL; 

Если вы хотите также, чтобы освободить весь массив, то вы можете написать

free(fooArray[0]); 
free(fooArray[1]); 

free(fooArray); 
+0

На самом деле это работает для меня, как я писал .. он сохраняет массив foo без ** – Lee

+0

@Lee Как я писал, ваш код недействителен. Вы должны решить, хотите ли вы создать массив из 5 указателей на объекты структуры или массив из 5 объектов структуры. –

1
struct foo* fooArray= malloc(sizeof(*fooArray)*5); 

, когда вы выделяете fooArray, вы выделяете ОДНЫЙ буфер размером 5 раз в структуре foo. Если вы хотите провести 5 структура Foo, вы хороши, но вы не должны таНос членов массива:

struct foo* newFoo = fooArray 
struct foo* newFoo2 = fooArray + 1; 
struct foo* newFoo3 = &fooArray[2]; /* array notation */ 

..и вы можете освободить их всех только сразу

free(fooArray); 

BUT ...

Если вы хотите, чтобы набор из 5 указателей был неправильным, и тип данных слева неверны.

struct foo* fooArray= malloc(sizeof(*fooArray)*5); 

следует читать:

struct foo** fooArray = malloc(sizeof(struct foo*) * 5); 

Это указатель на 5 указателей. Тогда ваша запись массива может работать для выделения и освобождения.

fooArray[0] = malloc(sizeof struct foo); 
free(fooArray[0]); 

Кстати, если вы хотите, «массив», чтобы расти и уменьшаться динамически, вы не wan't массив. вы хотите Single linked list

Просто включите указатель (struct foo *) в struct foo, и вы можете покончить с fooArray.

Смежные вопросы