即使分配的内存少于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]将是一个索引从0509999的数组。 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

下一篇: Limiting heap size for a Ruby process does not work