即使它分配的内存少于ulimit

时间:2015-07-07 14:38:48

标签: c memory segmentation-fault stack ulimit

我通过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时才会发生这种情况。

3 个答案:

答案 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]将是一个索引从0509999的数组。 a[510000]超出了数组范围。

答案 2 :(得分:0)

你正在破坏

中的堆栈
a[510000] = 1;

因为该数组中的最后一个索引小于510000.因此该赋值会覆盖堆栈上的数据,并且一旦其他语句尝试使用该数据,应用程序就会崩溃。