25

我保证以前有人问过这个问题,但我无法通过搜索找到它;提前对任何裁员感到抱歉。

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

char charArray[50];

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

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

char anotherCharArray[someVariable + 50];

这也会进入堆栈吗?如果你 free() this,我很确定代码会出现段错误,所以它让我认为它确实如此,但它对我来说真的没有意义。同样,当通过 malloc 分配数据时,您必须使用 free() 的 100% 唯一情况吗?

在此先感谢您的帮助。

4

2 回答 2

16

如果char charArray[50];在文件范围(所有函数之外)或 is 定义static,它不会在堆栈上,它将是在程序的 start 变量处预分配的全局。如果不是static并且在函数范围内定义,它将在堆栈上。

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

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

您不使用,或free()未分配的内容。简单的。某些功能可能意味着使用上述之一,例如 POSIX 。malloc()calloc()realloc()strdup()

于 2012-10-13T15:43:33.480 回答
6

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

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

char anotherCharArray[someVariable + 50];

这也会进入堆栈吗?

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

于 2012-10-13T15:39:29.573 回答