【发布时间】:2018-04-25 10:41:42
【问题描述】:
我在malloc 通话中遇到了一个奇怪的问题。我正在开发一个使用巨大数组(以 GB 为单位的大小)的程序,并且在尝试使用 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
同样对大小为>= 17GB 的malloc 的单个调用失败,但对16GB 的多个调用正在通过。
当我的系统 RAM 大小只有 64GB 时,有人可以解释为什么 malloc 能够分配这么多内存,以及 malloc 在单次/多次调用中究竟是如何工作的
【问题讨论】:
-
else只属于if(g == NULL)支票,不属于其他支票。 -
如果你告诉我们那是什么系统,有人可能会和你讨论你系统上特定的
malloc实现是如何做这些事情的。 C 语言规范本身并不涉及这个问题。 -
至于你的问题,你说你的 RAM 大小是 64 GiB,但是是 physical 内存大小,还是 virtual 内存大小?
-
我知道,但是打印可以没有别的
-
此外,只要您不使用您分配的页面,某些系统(如 Windows IIRC)实际上允许您分配 更多 的可用虚拟内存。如果您开始写入页面并且无法换入,那么您将开始看到失败。
标签: c arrays memory memory-management