C 标准定义了很多下限/上限(翻译限制),并规定了每个翻译都应该满足的实现。为什么没有为数组大小定义这样的最小限制?以下程序将编译良好,可能会产生运行时错误/段错误,并会调用未定义的行为。
int main()
{
int a[99999999];
int i;
for(i=0;i<99999999;i++)
a[i]=i;
return 0;
}
一个可能的原因可能是在自动存储上分配了本地数组,这取决于分配的堆栈帧的大小。但是为什么不像 C 定义的其他限制那样设置最小限制呢?
让我们忘记上面的未定义情况。考虑以下:
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
a[i]=i;
return 0;
}
在上面,是什么让我保证本地数组(尽管非常小)将按预期工作并且不会由于分配失败而导致未定义的行为?
尽管在任何现代系统上分配如此小的阵列都不太可能失败。但是 C 标准没有定义任何要满足的要求,编译器也没有(至少 GCC 没有)报告分配失败。只有运行时错误/未定义的行为是可能的。困难的部分是没有人可以判断任意大小的数组是否会由于分配失败而导致未定义的行为。
请注意,我知道我可以为此目的使用动态数组(通过malloc和朋友),并且可以更好地控制分配失败。我更感兴趣的是为什么没有为本地数组定义这样的限制。此外,全局数组将存储在静态存储中,并将增加编译器可以处理的可执行文件大小。