与 不同的是malloc
,我从未见过if
检查数组是否有足够空间的语句。那么是否保证数组即使分配在堆栈中也总是获得足够的空间?否则该怎么办?
5 回答
根本没有保证。
没有办法验证堆栈分配是否成功。C 标准不强制要求任何限制(最小值或最大值)。
因此,您应该检查通常分配固定大小堆栈的操作系统。例如,在我的 Ubuntu 系统上,堆栈大小为1MB
. 所以这取决于你的操作系统。
事实上,如果你开始怀疑堆栈大小是否足够,你应该去动态分配(malloc
)。
不,标准中没有任何内容允许这样做,顺便说一句,它不仅适用于数组,还适用于所有 C 变量。如果堆栈溢出,那么它将使您的程序崩溃。死的。例如,过度使用递归可能会产生这种影响。
为了增加复杂性,您是在询问“经典”ANSI C 数组,其大小在编译时固定,还是 C99 可变长度数组 (VLA),其大小可以在运行时设置?
尽管 VLA 看起来很有吸引力,但正如您所建议的,它们缺乏运行时检查是 malloc 的明显劣势。
这取决于您如何定义数组。
例如:
int foo[] = { 1, 2, 3 };
int bar[10] = { 1, 0 };
int fee[10];
在上面的示例中,数组foo
将包含三个带有赋值内容的条目。bar
另一方面,该数组将包含十个条目,第一个初始化为1
,其余为零。该数组fee
也将包含十个条目,但内容未初始化并且很可能出现随机。
但是,就像数组末尾分配的内存一样malloc
,数组可以被覆盖。例如,您可以这样做foo[4] = 4;
,但这会覆盖数组外的内存,甚至可能导致崩溃。
因此,数组将始终具有与您声明的一样多的条目(或您如何看待它的内存),并且在foo
上面的示例中将有足够的空间来存储您分配给它的数据。
通常,malloc
将尝试分配空间,然后您可以使用if
条件来检查指向数组的指针是否已成功分配:
if (ptr == NULL) {
printf("Error");
exit();
}
数组将始终获得足够的空间,无论是有效的还是无效的,即如果堆栈没有足够的空间,那么很有可能您可能会使用一些其他专门用于其他目的的内存。在这种情况下,您的程序将导致未定义的行为(堆栈溢出:))