我最近一直在尝试使用C语言,只是想了解硬件上发生了什么以及编译器在幕后做了什么。当我分配了大量的代码时,我的代码一直崩溃,我不知道为什么。我写了一个测试片段,看看我能让这种情况发生多小。片段看起来像:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 400000000;
int* x = malloc(sizeof(int)*n);
if (x == NULL)
{
printf("isnull\n");
system("PAUSE");
return 0;
}
x[0] = 1;
for(int i = 1; i < n; i++)
{
x[i] = x[i - 1] + 1;
}
printf("%i\n", x[n - 1]);
system("PAUSE");
return 0;
}
我注意到了一些事情:
首先,这个大小似乎接近极限。4亿个元素不会使程序崩溃,但5亿个元素会。
我不相信我达到了整数溢出限制,但如果我将n更改为无符号,程序的行为是一样的。
我有充足的系统资源,5亿个整数只需要2GB,而我有接近8GB的可用空间。
我仍然不确定为什么会发生这种情况,但如果有人能分享对此的见解,我将不胜感激。
2条答案
按热度按时间a1o7rhls1#
1.总是检查
malloc
的结果,因为它可能会失败(并且您将取消引用NULL指针)。1.当一个进程消耗了太多的内存时,操作系统可能会终止程序。操作系统会干预终止程序,这可能会破坏主机的稳定性(Linux退出代码137)。
https://godbolt.org/z/96n9sbaMc
如果您需要在Linux中使用内存,请尝试增加交换文件的大小(即使是临时增加
swapon
),检查并设置系统限制(ulimit
)nnvyjq4y2#
堆内存是内存的一部分,你不会得到8GB的堆内存,你需要记住的是,还有一些空间是留给栈、变量、全局变量和堆的。