我保证之前已经问过这个问题,但是我无法通过搜索找到它;对于任何裁员,提前抱歉。
我(可能是错误的)理解当你在编译时知道对象的大小时,你只分配给堆栈。所以在初始化数组的情况下,你可以做其中一个(这应该在堆栈上):
char charArray[50];
由于此数组的大小在编译时是已知的,因此应该没有问题。
另一方面,这(我相信)也是有效的代码:
char anotherCharArray[someVariable + 50];
这也会进入堆叠吗?我很确定代码段错误如果你释放()这个,所以它让我觉得它确实如此,但它对我来说并没有多大意义。同样,100%唯一的情况是,当通过malloc分配数据时,你必须使用free()吗?
提前感谢您的帮助。
答案 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中的标准。