堆栈结构与堆结构有什么区别?

What is the difference between stack struct vs heap struct?

// 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 的定义和两个用于进一步初始化的辅助函数。

我不太明白它们之间的区别,以及它们的好处是什么?

它不仅仅是访问器 ->. 吗?

最后一个函数分配的不是静态结构,而是栈上的结构。您的程序有两种内存,堆和堆栈。 static 是另一个关键字(有超过 1 次使用,具体取决于它们的使用位置,但它不是当前主题)。

堆分配比堆栈分配使用更多资源,但不受使用它们的范围的限制。您可以操作在函数之间分配的结构堆,而不必认为它们可以“自动释放”,因为它们绑定的范围消失了(又名:初始函数 returned)。

一个例子是链表。您不能依赖堆栈分配来构建结构链表。

堆分配可能会失败,您始终必须检查 malloc、calloc 和 cie 是否 return NULL。

堆栈分配不会像那样失败。如果你吸光了所有的堆栈,你的程序就会崩溃。 (或者做一些花哨的事情,这是未定义的行为)。但你无法从中恢复过来。

堆栈分配的内存在函数 returns 上被“释放”。 不是堆分配的内存。但是你必须手动释放它(function free)