C阵列实例化 - 堆栈或堆分配?

时间:2012-10-13 15:36:46

标签: c memory-management stack heap

我保证之前已经问过这个问题,但是我无法通过搜索找到它;对于任何裁员,提前抱歉。

我(可能是错误的)理解当你在编译时知道对象的大小时,你只分配给堆栈。所以在初始化数组的情况下,你可以做其中一个(这应该在堆栈上):

char charArray[50];

由于此数组的大小在编译时是已知的,因此应该没有问题。

另一方面,这(我相信)也是有效的代码:

char anotherCharArray[someVariable + 50];

这也会进入堆叠吗?我很确定代码段错误如果你释放()这个,所以它让我觉得它确实如此,但它对我来说并没有多大意义。同样,100%唯一的情况是,当通过malloc分配数据时,你必须使用free()吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

如果char charArray[50];在文件范围内定义(在所有函数之外)或static,则它不会在堆栈中,它将成为程序启动变量的全局预分配。如果它不是static并且是在函数范围定义的,那么它将在堆栈中。

char anotherCharArray[someVariable + 50];只能在函数范围内定义,并且将在堆栈中。

以上所有内容都适用于C.的典型实现。非典型实现可以使用堆而不是堆栈,而不是程序数据部分中的预分配空间。

free()malloc()calloc(),您没有realloc()未分配的内容。简单。一些功能可能意味着使用上述之一,例如, POSIX strdup()

答案 1 :(得分:5)

  

同样,当通过malloc分配数据时,你必须使用free()的100%唯一情况吗?

是。 (除了calloc和realloc之外,它们的返回值也是free()'d。类似地,有些函数使用malloc()并记录了这个事实,例如strdup() - 返回值显然,这些函数也可以使用free()释放。)

char anotherCharArray[someVariable + 50];
  

这也会进入堆叠吗?

是的,它确实(在大多数实现中 - 当然,你假设它不是总是是真的,但在大多数平台上,它是)。是的,这是有效的代码,但它只是C99中的标准。