2015-05-06 14 views
0

我看着這樣的事情之前,我貼這個帖子,但沒有找到..解放出來一個結構數組用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'中分配一個指針?我想你應該像'malloc(sizeof(foo))'中那樣分配'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's – Lee

+0

@Lee正如我寫你的代碼是無效的。您應該決定是否要爲結構的對象或結構的5個對象的數組創建一個由5個指針組成的數組。 –

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

當你分配fooArray時,你分配一個大小爲結構foo的5倍的 的緩衝區。如果你想保持5結構Foo的,你是好人,但是你沒有的malloc數組成員:

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

..和你只能釋放一次全部

free(fooArray); 

但...

如果你想要一組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]); 

順便說一句,如果你想要一個「數組」動態增長和收縮,你不希望數組。你想有一個Single linked list

就包括在結構FOO一個(結構FOO *)指針,你可以用fooArray做掉。

相關問題