我保证这个问题以前有人问过,但我没能通过搜索找到它;对于任何冗余提前道歉。
我的(可能是错误的)理解是只有在编译时知道对象的大小时才分配给堆栈。因此,在初始化数组的情况下,您可以执行以下操作之一(这应该在堆栈上):
char charArray[50];
由于此数组的大小在编译时已知,因此应该没有问题。
另一方面,这(我相信)也是有效的代码:
char anotherCharArray[someVariable + 50];
这也会进入堆栈吗?我很确定如果你 free() 这个代码段错误,所以它让我认为它确实如此,但它对我来说真的没有意义。同样,当通过 malloc 分配数据时,您必须使用 free() 的 100% 唯一情况是什么?
预先感谢您的帮助。
最佳答案
如果 char charArray[50];
是在文件范围内定义的(在所有函数之外)或者是 static
,它不会在堆栈上,它会成为程序开始变量的全局预分配。如果它不是 static
并且是在函数范围内定义的,它将位于堆栈中。
char anotherCharArray[someVariable + 50];
只能在函数范围内定义,并且会在堆栈上。
以上所有内容都适用于 C 的典型实现。非典型实现可能会使用堆而不是堆栈,而不是程序数据部分中的预分配空间。
你不会 free()
没有用 malloc()
、calloc()
或 realloc 分配的东西()
。简单的。某些功能可能暗示使用上述功能之一,例如POSIX strdup()
。
关于C 数组实例化 - 堆栈或堆分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874604/