即使 Proc 分配的内存少于 ulimit 限制的内存,它也会崩溃

Proc crashes even if it allocates less memory than limited by ulimit

我已通过 ulimit -s 2000 和 ulimit -Ss 2000 将堆栈大小设置为 2000Kb 以实现硬限制。在下面的程序中,我分配了大约 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 限制时才会发生这种情况。

这里的问题是,在下面提到的语句中

  a[510000] = 1;
  printf("%d", a[510000]);

您有 off-by-one index. The above statements are accessing array out of bounds. This in turn invokes undefined behaviour. One of the side effects of UB, other than getting a nasal demon 是分段错误("Crash!!")。

记住,C 使用基于 0 的数组索引。

int a[510000] 将是一个索引从 0509999 的数组。 a[510000]超出数组范围。

您正在破坏

中的堆栈
a[510000] = 1;

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