为什么我可以分配大于RAM的数组?

时间:2017-11-12 18:56:31

标签: c arrays memory memory-management

我遇到malloc次来电时遇到的奇怪问题。我正在研究一个程序,它使用巨大的数组(GBs中的大小),并在尝试使用malloc为阵列分配内存时我发现malloc即使我分配的是更大的大小也是成功的比我的RAM(64GB)。

见下面的代码:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>


#define Sixteen_G  16000000000

int main() {
    int *c = (int *)malloc(sizeof(int)*Sixteen_G);
    int *d = (int *)malloc(sizeof(int)*Sixteen_G);
    int *e = (int *)malloc(sizeof(int)*Sixteen_G);
    int *f = (int *)malloc(sizeof(int)*Sixteen_G);
    int *g = (int *)malloc(sizeof(int)*Sixteen_G);
    if(c == NULL)
            printf("c Allocation failed\n");
    if(d == NULL)
            printf("d Allocation failed\n");
    if(e == NULL)
            printf("e Allocation failed\n");
    if(f == NULL)
            printf("e Allocation failed\n");
    if(g == NULL)
            printf("e Allocation failed\n");
    else
            printf("All arrays allocated\n");
    return 0;
}

上述代码的输出是:

All arrays allocated

同样,对大小为malloc的{​​{1}}的一次调用失败,但多次调用>= 17GB正在通过。

有人可以解释为什么malloc能够分配那么多内存,当我的系统RAM大小只有64GB时,以及16GB对单个/多个呼叫的准确程度

1 个答案:

答案 0 :(得分:4)

您可能想要停用memory overcommitment

(我真的不喜欢这个功能)

请参阅this问题。

您应该编码并test against malloc failure

详细了解virtual address space。另请参阅this