簡體   English   中英

在沒有Malloc的情況下分配一個結構數組?

[英]Allocating an Array of Structs without Malloc?

我有一個以這種方式定義的結構。

typedef struct COUNTRY {
    char Code[3];
    char Country[30];
    int Population;
    float Expectancy;
    struct Country *Pointer;
} COUNTRY;

我看到像這樣分配的結構數組:

COUNTRY *countries = calloc(128, sizeof(COUNTRY));

或者像這樣:

COUNTRY *countries = malloc(128 * sizeof(COUNTRY));

但這是做什么的:

COUNTRY countries[128] = {};

因為在所有情況下我仍然可以寫入每個條目的字段。 第三種選擇只是糟糕的形式嗎? 對我來說似乎更好,因為你可以 main() 之外添加其余的變量聲明。 否則,您只能在main()或其他函數內部調用calloc()或malloc()。

難道我做錯了什么?

這個:

COUNTRY countries[128];

只需定義一個類型為“128個COUNTRY元素的數組”的對象。

= {}是一個初始化器 - 但空的初始化器在C中是非法的(我認為gcc支持它們作為擴展)。 便攜式替代方案是:

COUNTRY countries[128] = { 0 };

其中所有元件的所有成員初始化至零( 0為整數, \\0'為字符, 0.0浮點, NULL為指針,並遞歸地用於子元件)。 但是,由於您指定了數組中的元素數(為128 ),因此初始化程序不會影響數組對象的分配方式。

如果聲明發生在函數定義中,則數組對象具有自動存儲持續時間 ,這意味着當執行到達封閉塊的末尾時它不再存在。 這些對象通常分配在“堆棧”上。

如果它出現在任何函數定義之外(在文件范圍內或者如果它具有關鍵字static ,那么它具有靜態存儲持續時間 ,這意味着它對於程序的整個執行仍然存在。

使用malloccalloc 分配的對象已分配存儲持續時間 ,這意味着它們將繼續存在,直到通過調用free()顯式釋放它們為止。 這些對象通常分配在“堆”上。 (我忽略了realloc() ,這使描述復雜化了一些。)

前兩個語句將在堆上分配結構數組,而最后一個語句將初始化堆棧上的結構數組。

它不是一個糟糕的形式,只是你希望你的數據存儲在堆棧中的問題(當你的變量超出范圍時自動釋放,堆棧通常比堆大小更小,所以你可以溢出它如果你在那里放置大數據結構,或在堆上(數據的生命周期與范圍無關,你需要手動釋放你的內存)。

對我來說似乎更好,因為你可以在main()之外添加其余的變量聲明。

如果您需要使用程序生命周期的靜態分配對象,請使用此方法,它沒有任何問題。 請注意,在這種特殊情況下,變量不會存儲在堆棧中,而是存儲在程序的.data段中(請查看此問題以獲取更多詳細信息: 如何存儲全局變量? )。

最后一種形式是“堆棧分配”或“靜態分配”。 與calloc一樣,所有字段都將清零。

在函數內部,它是'堆棧分配',當函數返回時,內存將消失。

在任何函數之外,在文件范圍內,它是靜態分配的,並且在main()啟動之前分配一個全局內存塊。

當您在編譯時不知道需要多少時,使用malloc / calloc。 例如,在鏈表中,您需要動態分配/取消分配節點。 使用數組時,您可以確切地知道編譯時需要多少數組。

什么也不同是內存取之。 如果在函數中聲明一個數組,則將從堆棧中獲取內存。 在malloc / calloc的情況下,內存被放在堆中

= {};

是GNU C擴展,與以下內容相同:

= {0};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM