当我有8GB可用内存时,为什么malloc(500000000)返回NULL?

o7jaxewo  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(127)

我最近一直在尝试使用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的可用空间。
我仍然不确定为什么会发生这种情况,但如果有人能分享对此的见解,我将不胜感激。

a1o7rhls

a1o7rhls1#

1.总是检查malloc的结果,因为它可能会失败(并且您将取消引用NULL指针)。
1.当一个进程消耗了太多的内存时,操作系统可能会终止程序。操作系统会干预终止程序,这可能会破坏主机的稳定性(Linux退出代码137)。
https://godbolt.org/z/96n9sbaMc
如果您需要在Linux中使用内存,请尝试增加交换文件的大小(即使是临时增加swapon),检查并设置系统限制(ulimit

nnvyjq4y

nnvyjq4y2#

堆内存是内存的一部分,你不会得到8GB的堆内存,你需要记住的是,还有一些空间是留给栈、变量、全局变量和堆的。

相关问题