// Define Person
typedef struct Person {
char *name;
int age;
} person_t;
// Init person in heap
person_t *create_person_v1(char *name, int age)
{
person_t *person = calloc(1, sizeof(person_t));
person->name = name;
person->age = age;
return person;
}
// Init person on stak? a static struct I guess?
person_t create_person_v2(char *name, int age)
{
return (person_t) {name, age};
}
上面的代碼有一個 Person 的定義和兩個用于進一步初始化的輔助函式。
我真的不明白它們之間的區別,擁有它們有什么好處?
它不僅僅是訪問器->和.?
uj5u.com熱心網友回復:
最后一個函式不分配靜態結構,而是分配堆疊上的結構。您的程式有兩種記憶體,堆和堆疊。static 是另一個關鍵字(使用次數超過 1 次,具體取決于使用位置,但不是當前主題)。
堆分配比堆疊分配使用更多的資源,但與使用它們的范圍無關。您可以操作在函式之間分配的結構堆,而不必認為它們可以“自動釋放”,因為它們系結的范圍消失了(又名:回傳的初始函式)。
一個例子是鏈表。您不能依賴堆疊分配來構建結構鏈表。
堆分配可能會失敗,您必須始終檢查 malloc、calloc 和 cie 是否不回傳 NULL。
堆疊分配不會像那樣失敗。如果你吸了所有的堆疊,你的程式就會崩潰。(或者做一些花哨的事情,這是未定義的行為)。但你無法從中恢復。
堆疊分配的記憶體在函式回傳時“釋放”。不是堆分配的記憶體。但是你必須手動釋放它(功能免費)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338870.html
上一篇:C中的Strlen安全
