C 数组实例化 - 堆栈或堆分配?

标签 c memory-management heap-memory stack-memory

我保证这个问题以前有人问过,但我没能通过搜索找到它;对于任何冗余提前道歉。

我的(可能是错误的)理解是只有在编译时知道对象的大小时才分配给堆栈。因此,在初始化数组的情况下,您可以执行以下操作之一(这应该在堆栈上):

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/

相关文章:

C 中的 char 数据类型

c - 使用 Arduino 提高精度( float )

java - 没有状态字段的java对象如何存储在JVM中?

node.js - Grunt CLI 尝试编译 bootstrap.less 时崩溃

heap-memory - !heap -x -v 和 !heap -flt s 之间的矛盾

c - 通过 C 中的空格将用户输入的字符串拆分为单独的标记

c - Vala 生成的 C 代码比手写的 C 代码优化了多少?

ios - 虚拟机 : CG raster Data memory keep growing

c - 如何在c中的函数中释放分配的数组

iphone - 如何弄清楚有多少其他应用程序在后台运行?