3

与 不同的是malloc,我从未见过if检查数组是否有足够空间的语句。那么是否保证数组即使分配在堆栈中也总是获得足够的空间?否则该怎么办?

4

5 回答 5

3

根本没有保证。

没有办法验证堆栈分配是否成功。C 标准不强制要求任何限制(最小值或最大值)。

因此,您应该检查通常分配固定大小堆栈的操作系统。例如,在我的 Ubuntu 系统上,堆栈大小为1MB. 所以这取决于你的操作系统。

事实上,如果你开始怀疑堆栈大小是否足够,你应该去动态分配(malloc)。

于 2012-06-07T12:27:48.213 回答
0

不,标准中没有任何内容允许这样做,顺便说一句,它不仅适用于数组,还适用于所有 C 变量。如果堆栈溢出,那么它将使您的程序崩溃。死的。例如,过度使用递归可能会产生这种影响。

为了增加复杂性,您是在询问“经典”ANSI C 数组,其大小在编译时固定,还是 C99 可变长度数组 (VLA),其大小可以在运行时设置?

尽管 VLA 看起来很有吸引力,但正如您所建议的,它们缺乏运行时检查是 malloc 的明显劣势。

于 2012-06-07T12:36:52.797 回答
0

这取决于您如何定义数组。

例如:

int foo[] = { 1, 2, 3 };
int bar[10] = { 1, 0 };
int fee[10];

在上面的示例中,数组foo将包含三个带有赋值内容的条目。bar另一方面,该数组将包含十个条目,第一个初始化为1,其余为零。该数组fee也将包含十个条目,但内容未初始化并且很可能出现随机。

但是,就像数组末尾分配的内存一样malloc,数组可以被覆盖。例如,您可以这样做foo[4] = 4;,但这会覆盖数组外的内存,甚至可能导致崩溃。

因此,数组将始终具有与您声明的一样多的条目(或您如何看待它的内存),并且在foo上面的示例中将有足够的空间来存储您分配给它的数据。

于 2012-06-07T12:25:15.953 回答
0

通常,malloc将尝试分配空间,然后您可以使用if条件来检查指向数组的指针是否已成功分配:

if (ptr == NULL) {
   printf("Error");
   exit();
}
于 2012-06-07T20:50:28.933 回答
0

数组将始终获得足够的空间,无论是有效的还是无效的,即如果堆栈没有足够的空间,那么很有可能您可能会使用一些其他专门用于其他目的的内存。在这种情况下,您的程序将导致未定义的行为堆栈溢出:))

于 2012-06-07T12:19:18.953 回答