即使分配的内存少于ulimit限制,proc也会崩溃
我已经通过ulimit -s 2000设置堆栈大小为2000Kb,ulimit -Ss 2000为硬限制。 而在下面的程序中,我已经分配了小于我限制的appox 2040000(510000×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限制时才会发生这种情况。
int a[510000]
将是一个索引从0
到509999
的数组。 a[510000]
在数组范围之外。
这里的问题是,在下面提到的声明
a[510000] = 1;
printf("%d", a[510000]);
你有一个索引。 上述语句正在访问数组越界。 这又会调用未定义的行为。 UB的一个副作用,除了得到一个鼻子恶魔是分段故障(“Crash !!”)。
请记住, C
使用基于0
的数组索引。
你正在损坏堆栈
a[510000] = 1;
因为该数组中的最后一个索引小于510000.因此,分配会覆盖堆栈上的数据,并且一旦其他语句尝试使用该数据,应用程序就会崩溃。
链接地址: http://www.djcxy.com/p/80255.html上一篇: Proc crashes even if it allocates less memory than limited by ulimit