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

问题描述 投票:0回答:2

我最近一直在用 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可用。

我仍然不确定为什么会这样,但是如果有人可以分享对此的见解,我将不胜感激。我一直在 Windows 10、MinGW GCC 9.2.0 上运行它

c memory crash malloc
2个回答
1
投票
  1. 始终检查
    malloc
    的结果,因为它可能会失败(并且您将取消引用 NULL 指针)。
  2. 当进程消耗过多内存时,操作系统可能会终止程序。操作系统干预以终止可能会破坏主机稳定性的程序(Linux 退出代码 137)。

https://godbolt.org/z/96n9sbaMc

如果你需要在 Linux 中使用内存,请尝试增加交换文件的大小(即使是暂时的

swapon
),检查并设置系统限制(
ulimit


0
投票

堆内存是 ram 的一部分。您没有获得完整的 8GB 堆。为堆栈、变量、全局内容和堆预留空间,您必须牢记。

© www.soinside.com 2019 - 2024. All rights reserved.