2013-03-04 66 views
1

我在我的c代碼中有一個約300Bytes(5xint + 256chars)的結構體,我希望有一個很好的數組機制來處理這個結構體的所有'對象'。 我想擁有一個全局指針數組,所以首先數組中的所有索引都指向NULL,但是當我需要它時(malloc)我初始化每個索引,並在im完成時刪除它(free)。指向C中結構體的指針陣列

typedef struct myfiles mf; 
mf* myArr[1000]; 

這是我在找什麼?與數組混合的指針經常讓我困惑。 如果是這樣,只是clerify,確實

mf myArr[1000]; 

已經堆棧,那裏有我的第一個建議只分配1000pointers在分配1000個結構?

回答

3

你是對的。前者分配1000個指針,其中沒有一個被初始化,後者初始化每個約300個字節的1000個對象。

要initalize爲null:foo_t* foo[1000] = {NULL};

但這仍然是愚蠢的。爲什麼不只是mf* myArr = NULL?現在,您有一個指向未初始化內存的指針,而不是指向初始化內存的1000個指針以及一個用於跟蹤的指針。你寧願做

myArraySingle = malloc(sizeof(mf)*1000);

for(int i = 0; i < 1000; i++) { 
    myArray[i] = malloc(1000); 
} 

,並獲得由myArraySingle[300]或*(myarray的[300])`?無論如何,我的觀點是語法,不要創造這種不必要的間接性。單個指針可以指向一個連續的內存塊,其保持對象序列,很像一個數組,這是爲什麼指針支持陣列樣式語法和爲什麼數組索引爲0

+0

謝謝。是否可以依賴於我的第一個建議中的所有指針都是NULL,還是指向內存中的任意位置的事實? – buddy123 2013-03-04 05:03:02

+0

最好在數組上做一個memset以確保所有指針指向NULL。 – Jay 2013-03-04 05:04:23

+0

@ e-r-a-n請參閱編輯,因爲我認爲C99,所以您可以在一行中做到這一點。 – djechlin 2013-03-04 05:04:57

1
typedef struct myfiles mf; 
mf* myArr[1000]; 

啓動這就是你正在尋找。這將爲結構mf分配1000個指針的數組。

1

你似乎正確理解。

更準確地說,我相信mf* myArr[1000] = { 0 };會更好地滿足您的要求,因爲您希望保證所有元素都將被初始化爲空指針。沒有初始化,該保證不存在。

C中沒有「全局」。您指的是具有靜態存儲持續時間的對象,在文件範圍聲明。

0
typedef struct myfiles mf; 
mf* myArr[1000]; 

是的,它會初始化1000點的指針,你必須分配內存以每一個使用malloc /釋放calloc後使用。