何时使指针指向堆上的结构与堆栈上的结构? [复制]
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* a
和 foo* c
之间的唯一区别是每个指向的位置。应该首选哪一个?我通常会看到更多malloc()
,但我不明白为什么。
【问题讨论】:
这取决于应用程序。 当从main
定义时,这并不重要,因为来自 main
的变量比子程序中的任何其他变量的寿命更长(如果数据太大,您可能会耗尽堆栈,不过)
如果您只打算在函数范围内使用值,或者如果您将值复制到其他地方,请使用堆栈。如果您打算返回指向您从函数分配的内存的指针,请使用堆,并且您希望在使用完内存块后在其他地方 free()
它。 FWIW,堆内存比堆栈内存需要更多的周期来读写,因为它访问外部 RAM。
【参考方案1】:
我认为您应该 malloc()
仅用于更大的数据。您应该考虑malloc()
需要更多时间,因为它必须在堆中找到搜索数据块并保留它。如果您使用堆栈上的结构,则没有必要。所以这真的取决于你在做什么。
编辑:您还应该考虑变量的范围。如果仅在函数中需要结构,我更喜欢堆栈。
【讨论】:
虽然我已经把这个问题作为一个骗子结束了,但 +1 指出了范围/生命周期的考虑。欺骗目标的答案只涉及到这一点,但这是主要原因之一。 谢谢。 为什么只在函数内部需要堆栈时使用堆栈会更好? 因为它比使用堆更快。【参考方案2】:堆分配的数据更容易与其他人共享(即跨函数边界),尤其是当创建对象的函数需要在该函数退出时使其可用时。这对于非堆数据是不可能的(除非使用static
,但这也会产生问题),这可能是相当有限的。
【讨论】:
以上是关于何时使指针指向堆上的结构与堆栈上的结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章