与malloc
不同,我从未见过if
语句来检查数组是否有足够的空间。那么,即使它们被分配在堆栈中,它仍然保证数组总是获得足够的空间吗?如果不这样做该怎么办?
答案 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();
}