是否保证指定的数组总是获得足够的空间?

时间:2012-06-07 12:16:54

标签: c arrays

malloc不同,我从未见过if语句来检查数组是否有足够的空间。那么,即使它们被分配在堆栈中,它仍然保证数组总是获得足够的空间吗?如果不这样做该怎么办?

5 个答案:

答案 0 :(得分:3)

完全没有保证。

无法验证堆栈分配是否成功。 C标准没有规定任何限制(最小或最大)。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

例如:

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

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

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

因此,当您声明它时,数组将始终具有尽可能多的条目(或您所看到的内存),并且在上面foo的示例中将为您分配的数据提供足够的空间它。

答案 3 :(得分:0)

标准中没有任何内容允许这样做,并且它不仅适用于数组,它适用于所有C变量。如果堆栈溢出则会导致程序崩溃。死。例如,过度使用递归可能会产生这种效果。

为了增加一个复杂因素,您是否在询问经典' ANSI C数组,其大小在补偿时固定,或C99可变长度数组(VLA),其大小可以在运行时设置?

虽然VLA看起来很有吸引力,但它们缺乏运行时检查是一个独特的正如你所说,对malloc的劣势。

答案 4 :(得分:0)

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

if (ptr == NULL) {
   printf("Error");
   exit();
}