【问题标题】:What is the difference between stack struct vs heap struct?堆栈结构与堆结构有什么区别?
【发布时间】:2021-12-12 18:26:59
【问题描述】:
// 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 的定义和两个用于进一步初始化的辅助函数。

我不太了解它们之间的区别,以及各有什么好处?

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

【问题讨论】:

  • 无关:您正在复制name 指针,因此您最终有两种访问名称的方式(通过调用代码中使用的原始指针和通过结构)。通过任何这些方式对name 所做的任何更改将在通过其他方式访问name 时反映。也许您想改用malloc() 和strcpy()?
  • create_person_v1 返回一个指向person_t 的指针,而create_person_v2 返回一个person_t。这是根本不同的。如果你在理解这一点上有困难,我强烈建议你再读一遍你的 C 学习资料中处理指针的那一章。
  • @Jabberwocky 我很确定 PO 了解两者之间的技术差异,但不了解功能差异。很多课程都停在第一点。
  • @pmg 是的,你是对的。我可以以某种方式破坏第一个指针吗?只是为了
  • 有趣的事情:标准对“堆栈”或“堆”一无所知......

标签: c struct types heap-memory difference


【解决方案1】:

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

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

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

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

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

堆栈分配的内存在函数返回时被“释放”。 不是堆分配的内存。但是你必须手动释放它(具有免费功能)

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2021-05-10
    • 2018-04-27
    • 2011-01-03
    • 2016-01-19
    • 2016-08-18
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多