【发布时间】:2012-10-04 04:28:08
【问题描述】:
我保证以前有人问过这个问题,但我无法通过搜索找到它;提前对任何裁员表示歉意。
我的(可能是错误的)理解是,只有在编译时知道对象的大小时才分配给堆栈。因此,在初始化数组的情况下,您可以执行以下操作之一(这应该在堆栈上):
char charArray[50];
由于这个数组的大小在编译时是已知的,这应该没有问题。
另一方面,这(我相信)也是有效的代码:
char anotherCharArray[someVariable + 50];
这也会进入堆栈吗?如果你 free() this,我很确定代码会出现段错误,所以它让我认为它确实如此,但它对我来说真的没有意义。同样,当通过 malloc 分配数据时,您必须使用 free() 的 100% 唯一情况吗?
提前感谢您的帮助。
【问题讨论】:
-
@Shookit:你需要指明你是在谈论局部变量还是全局变量。
-
@PaulR 如果数组是可变长度的,则它不能在全局范围内。
-
您必须区分自动存储和堆栈,后者是存储数据的低级方式。放置在自动存储中的数据也可以放置在其他地方,例如寄存器中。对于大小未知的本地数组(称为 VLA:s),编译器可以将其放在堆栈上,也允许在堆上分配内存(只要它在适当的位置释放它)。事实上,VLA:s 不能很好地与
setjmp/longjmp一起使用,因为它们可能会泄漏(C 标准允许这样做)。
标签: c memory-management heap-memory stack-memory