即使 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]
将是一个索引从 0
到 509999
的数组。 a[510000]
超出数组范围。
您正在破坏
中的堆栈
a[510000] = 1;
因为该数组中的最后一个索引比 510000 小一。因此该赋值会覆盖堆栈上的数据,一旦其他语句尝试使用该数据,您的应用程序就会崩溃。
我已通过 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]
将是一个索引从 0
到 509999
的数组。 a[510000]
超出数组范围。
您正在破坏
中的堆栈a[510000] = 1;
因为该数组中的最后一个索引比 510000 小一。因此该赋值会覆盖堆栈上的数据,一旦其他语句尝试使用该数据,您的应用程序就会崩溃。