Carrays实例化 – 堆栈或堆分配?

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

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

char charArray[50]; 

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

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

 char anotherCharArray[someVariable + 50]; 

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

在此先感谢您的帮助。

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

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

 char anotherCharArray[someVariable + 50]; 

这也会在堆栈上进行吗?

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

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

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

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

你没有free()没有用malloc()calloc()realloc()分配的东西。 简单。 某些function可能意味着使用上述之一,例如POSIX strdup()