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

Sho*_*kit 18 c heap stack memory-management

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

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

char charArray[50];
Run Code Online (Sandbox Code Playgroud)

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

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

char anotherCharArray[someVariable + 50];
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢您的帮助.

Ale*_*nze 9

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

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

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

你不是free()没有分配的malloc(),calloc()或者realloc().简单.某些功能可能意味着使用上述之一,例如POSIX strdup().

  • 如果我们在全局范围内,`char someArray [variableLenght];`是不允许的...... (2认同)

小智 6

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

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

char anotherCharArray[someVariable + 50];
Run Code Online (Sandbox Code Playgroud)

这也会在堆栈上进行吗?

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

  • @Shookit是的,这是一个完全错误的观念; 具有已知大小与分配内容无关.唯一的联系是,在以前的C版本中,由于各种历史原因,`auto`变量必须具有已知的大小,并且只能在堆栈上分配`auto`变量. (7认同)