何时使指针指向堆上的结构与堆栈上的结构? [复制]

Posted

技术标签:

【中文标题】何时使指针指向堆上的结构与堆栈上的结构? [复制]【英文标题】:When to make pointer point to a struct on the heap vs on the stack? [duplicate] 【发布时间】:2017-12-09 13:54:00 【问题描述】:
#include <stdio.h>
#include <stdlib.h>

typedef struct foo 
    char* text;
    int num;
 foo;

int main(void) 

    foo* a = malloc(sizeof(foo));
    a->text = "Something";
    a->num = 4;
    printf("%s %d\n", a->text, a->num);

    foo b;
    b.text = "Something";
    b.num = 4;
    foo* c = &b;
    printf("%s %d", c->text, c->num);

    return 0;

两者都打印完全相同的东西。 foo* afoo* c 之间的唯一区别是每个指向的位置。应该首选哪一个?我通常会看到更多malloc(),但我不明白为什么。

【问题讨论】:

这取决于应用程序。 当从 main 定义时,这并不重要,因为来自 main 的变量比子程序中的任何其他变量的寿命更长(如果数据太大,您可能会耗尽堆栈,不过) 如果您只打算在函数范围内使用值,或者如果您将值复制到其他地方,请使用堆栈。如果您打算返回指向您从函数分配的内存的指针,请使用堆,并且您希望在使用完内存块后在其他地方 free() 它。 FWIW,堆内存比堆栈内存需要更多的周期来读写,因为它访问外部 RAM。 【参考方案1】:

我认为您应该 malloc() 仅用于更大的数据。您应该考虑malloc() 需要更多时间,因为它必须在堆中找到搜索数据块并保留它。如果您使用堆栈上的结构,则没有必要。所以这真的取决于你在做什么。

编辑:您还应该考虑变量的范围。如果仅在函数中需要结构,我更喜欢堆栈。

【讨论】:

虽然我已经把这个问题作为一个骗子结束了,但 +1 指出了范围/生命周期的考虑。欺骗目标的答案只涉及到这一点,但这是主要原因之一。 谢谢。 为什么只在函数内部需要堆栈时使用堆栈会更好? 因为它比使用堆更快。【参考方案2】:

堆分配的数据更容易与其他人共享(即跨函数边界),尤其是当创建对象的函数需要在该函数退出时使其可用时。这对于非堆数据是不可能的(除非使用static,但这也会产生问题),这可能是相当有限的。

【讨论】:

以上是关于何时使指针指向堆上的结构与堆栈上的结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

堆上的结构? [复制]

为啥堆上的分配比栈上的分配快?

指向结构的指针上的点运算符

堆栈上的结构 - 字段已初始化? [复制]

结构中指向数组的 cudaFree 指针上的 CUDA 分段错误

为啥函数执行后没有释放堆上的元素?