堆栈结构与堆结构有什么区别?
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)
// 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)