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

我通过ulimit -s 2000设置堆栈大小为2000Kb,为硬限制设置ulimit -Ss 2000。 在下面的程序中,我已经分配了appox 2040000(510000 x 4)个字节,这个字节小于我的限制即。 2048000(2000 * 4)字节,但我看到我的程序崩溃了! 任何人都可以建议为什么会这样。

#include  #include  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的副作用之一,除了得到一个鼻子恶魔是分段错误(“崩溃!!”)。

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

你破坏了堆栈

 a[510000] = 1; 

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