2012-10-18 41 views
4

我需要確定一個全局結構(數組),由4個整數組成。 問題是,該結構數組的大小是事先不知道的。在C中定義一個全局結構指針?

我正在試着做某事。像這樣:

typedef struct 
{ 
    int value; 
    int MAXleft; 
    int MAXright; 
    int MAX; 
} strnum; 

int main() 
{ 
    int size; 
    scanf("%d", &size); 

    strnum numbers[size]; 

    return 0; 
} 

聽說,可以通過指針要做到這一點,但我不知道該怎麼辦。

回答

5

您可以爲幾種結構動態像這樣分配空間:

strnum *numbers = malloc(size * sizeof(strnum)); 

然後你可以使用它像任何規則的陣列(大部分)。

使用calloc而不是malloc可能會更方便。它分配一些塊並用零填充它們。請注意,malloc不會清除分配的內存。

strnum *numbers = calloc(size, sizeof(strnum)); 

當你與內存中完成,不要忘記打電話free(numbers),將返回分配的內存回內存管理器。

如果您不需要free當它不再需要和分配越來越多時,隨着程序繼續工作,程序的內存佔用量將增加,沒有很好的理由。這被稱爲內存泄漏,應該避免。它可能最終導致程序缺乏記憶和不可預知的結果。

不要忘了包含一個stdlib.h頭與內存分配函數的原型。

0

它被稱爲Dynamic Memory Allocation

你正在嘗試做的可以做如下的事情:

strnum* number; 
    int size = 0; 

    scanf("%d",&size); 

    number = malloc(size * sizeof(strnum)); 

另外,不要忘記釋放內存,一旦你使用數組來完成。

free(number); 
+0

在C中,您不會投出malloc返回的內容,如果您忘記包含stdlib.h,則可能會出現問題,因爲默認情況下返回類型(如果沒有原型是int)。通過不鑄造,你會接受。 –

+0

我不認爲如果分配正確的內存量,鑄造'malloc'會產生任何影響。 – sgarizvi

+3

如果有人使用32位PC上的malloc結果進行轉換,並嘗試編譯並在具有8字節指針和4字節整數的64位系統的計算機上啓動,那麼他或她可能會真的很難試圖理解爲什麼後者不起作用。問題是如果沒有原型,返回值將被截斷爲4字節的int,並且很可能會導致段錯誤! –

0

您可以從malloc()開始,然後在大小不斷增加時執行realloc()。 我建議你一次分配10個結構的池,以減少對realloc()的調用次數。