我通过ulimit -s 2000设置堆栈大小为2000Kb,为硬限制设置ulimit -Ss 2000。在下面的程序中,我已经分配了appox 2040000(510000 x 4)个字节,这个字节小于我的限制,即。 2048000(2000 * 4)字节,但我看到我的程序崩溃了!任何人都可以说明为什么会这样。
#include <stdio.h>
#include <malloc.h>
int main()
{
int a[510000] = {0};
a[510000] = 1;
printf("%d", a[510000]);
fflush(stdout);
sleep(70);
}
编辑1:崩溃不是因为数组索引超出限制,因为我尝试降低索引并仍然崩溃。只有当我限制为ulimit时才会发生这种情况。
答案 0 :(得分:2)
这里的问题是,在下面提到的陈述中
a[510000] = 1;
printf("%d", a[510000]);
您拥有 off-by-one 索引。以上语句正在访问数组越界。这反过来调用undefined behaviour。除了getting a nasal demon之外,UB的一个副作用是分段错误(“崩溃!!”)。
请记住,C
使用基于0
的数组索引。
答案 1 :(得分:2)
int a[510000]
将是一个索引从0
到509999
的数组。 a[510000]
超出了数组范围。
答案 2 :(得分:0)
你正在破坏
中的堆栈a[510000] = 1;
因为该数组中的最后一个索引小于510000.因此该赋值会覆盖堆栈上的数据,并且一旦其他语句尝试使用该数据,应用程序就会崩溃。