如何在Windows 10中使用calloc / malloc正确分配大量RAM?

时间:2019-09-11 02:36:53

标签: c malloc calloc

我需要使用calloc或malloc为n = 10 ^ 9(10亿)行的向量分配内存,但是当我尝试分配此内存量时,系统崩溃并返回NULL,我认为这是系统不允许我分配这么大的内存。我在具有16 GB RAM的64位平台中使用Windows 10。  但是,当我在Linux OS(Debian)中运行相同的代码时,系统实际上分配了我所需的数量,所以现在我想知道:

一旦我没有时间去使用Windows 10,如何分配这个大块  冒险使用Linux吗?

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

int main(void) {

uint32_t * a = calloc(1000000000, 4);
printf("a = %08x\n", a);

return 0;

}

1 个答案:

答案 0 :(得分:0)

C运行时不允许您这样做,但是Windows可以使用VirtualAlloc API而不是calloc。为lpAddress参数指定NULL,为flAllocationType指定MEM_COMMIT,为flProtect指定PAGE_READWRITE。还要注意,即使在这种情况下dwSize使用通常是DWORD的“ dw”修饰,该参数实际上是SIZE_T,对于64位版本,该参数为64位。

代码如下:

#include <windows.h>

...

LPVOID pResult = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
if(NULL == pResult)
{ /* Handle allocation error */ }

其中dwSize是您要分配的内存字节数,以后您可以使用VirtualFree释放分配的内存:VirtualFree(pResult,0,MEM_RELEASE);

当您指定MEM_DECOMMIT(而不是MEM_RELEASE)时,将使用VirtualFree的dwSize参数,该参数允许您将内存放回保留但未提交的状态(这意味着尚未找到实际的页面来满足分配)。 / p>