[英]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
,那么它具有靜態存儲持續時間 ,這意味着它對於程序的整個執行仍然存在。
使用malloc
或calloc
分配的對象已分配存儲持續時間 ,這意味着它們將繼續存在,直到通過調用free()
顯式釋放它們為止。 這些對象通常分配在“堆”上。 (我忽略了realloc()
,這使描述復雜化了一些。)
前兩個語句將在堆上分配結構數組,而最后一個語句將初始化堆棧上的結構數組。
它不是一個糟糕的形式,只是你希望你的數據存儲在堆棧中的問題(當你的變量超出范圍時自動釋放,堆棧通常比堆大小更小,所以你可以溢出它如果你在那里放置大數據結構,或在堆上(數據的生命周期與范圍無關,你需要手動釋放你的內存)。
對我來說似乎更好,因為你可以在main()之外添加其余的變量聲明。
如果您需要使用程序生命周期的靜態分配對象,請使用此方法,它沒有任何問題。 請注意,在這種特殊情況下,變量不會存儲在堆棧中,而是存儲在程序的.data
段中(請查看此問題以獲取更多詳細信息: 如何存儲全局變量? )。
最后一種形式是“堆棧分配”或“靜態分配”。 與calloc一樣,所有字段都將清零。
在函數內部,它是'堆棧分配',當函數返回時,內存將消失。
在任何函數之外,在文件范圍內,它是靜態分配的,並且在main()啟動之前分配一個全局內存塊。
= {};
是GNU C擴展,與以下內容相同:
= {0};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.