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

即使Proc分配的内存少于ulimit限制的内存,它也会崩溃,c,memory,segmentation-fault,stack,ulimit,C,Memory,Segmentation Fault,Stack,Ulimit,我已经通过ulimit-s2000和ulimit-ss2000将堆栈大小设置为2000Kb以实现硬限制。在下面的程序中,我已经分配了大约2040000(510000 x 4)字节,这比我限制的要少,即,。2048000(2000*4)字节,但我发现我的程序崩溃了!谁能告诉我为什么会这样 #include <stdio.h> #include <malloc.h> int main() { int a[510000] = {0}; a[510000] = 1

我已经通过ulimit-s2000和ulimit-ss2000将堆栈大小设置为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);
}
#包括
#包括
int main()
{
int a[510000]={0};
a[510000]=1;
printf(“%d”,a[510000]);
fflush(stdout);
睡眠(70);
}

编辑1:崩溃不是因为数组索引超出范围,因为我尝试了较低的索引,但仍然崩溃。只有当我通过ulimit进行限制时,才会发生这种情况

这里的问题是,在下面提到的陈述中

  a[510000] = 1;
  printf("%d", a[510000]);
你有索引。上述语句访问数组时超出了范围。这反过来又调用了。UB的副作用之一是分割错误(“崩溃!!”)


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

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

  a[510000] = 1;
  printf("%d", a[510000]);
你有索引。上述语句访问数组时超出了范围。这反过来又调用了。UB的副作用之一是分割错误(“崩溃!!”)


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

inta[510000]
将是索引从
0
509999
的数组
a[510000]
不在数组范围内。

int a[510000]
将是索引从
0
509999
的数组
a[510000]
超出了数组范围。

正在损坏中的堆栈

a[510000] = 1;

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

您正在损坏堆栈中的数据

a[510000] = 1;

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

为什么需要
#include
?这些行
a[510000]=1;printf(“%d”,a[510000])哎呀!为什么需要
#包括
?这些行
a[510000]=1;printf(“%d”,a[510000])哎呀!嗨,我知道。所以我尝试了这个#include int main(){inta[510000]={0};a[51000]=1;printf(“%d”,a[51000]);fflush(stdout);sleep(70);}并且崩溃了。注意:不受ulimit限制时不会崩溃!嗨,我知道。所以我尝试了这个#include int main(){inta[510000]={0};a[51000]=1;printf(“%d”,a[51000]);fflush(stdout);sleep(70);}并且崩溃了。注意:不受ulimit限制时不会崩溃!您好,请选中“说明”中的“编辑1”。@编码器您是否尝试更改堆栈大小?我猜是4000 KB。是的,我发现在4000 KB的限制下它不会崩溃,而在1000 KB的限制下它每次都会崩溃,但在2000 KB的限制下它会随机崩溃。因此,我认为有些东西被添加到了我分配的需求之外,以证明我有没有办法通过我的程序查看当前堆栈的使用情况?您可以做的是以固定值初始化整个堆栈,并查看堆栈是否被某些东西损坏。@Coder我尝试了您的代码,我看到了同样的情况。但如果我以su的形式启动它,它将始终正确运行。您好,请检查“说明”中的“编辑1”。@Coder您是否尝试更改堆栈大小?我猜是4000 KB。是的,我发现在4000 KB的限制下它不会崩溃,而在1000 KB的限制下它每次都会崩溃,但在2000 KB的限制下它会随机崩溃。因此,我认为有些东西被添加到了我分配的需求之外,以证明我有没有办法通过我的程序查看当前堆栈的使用情况?您可以做的是以固定值初始化整个堆栈,并查看堆栈是否被某些东西损坏。@Coder我尝试了您的代码,我看到了同样的情况。但如果我以su的形式启动它,它将始终正确运行。您好,请选中“说明”中的“编辑1”。您好,请选中“说明”中的“编辑1”。