我正在尝试使用c语言中的malloc来分配大量数据。当我将数组大小增加到超过一定值时,程序终止说“program.c”停止工作。我想知道正确的方法通常在cI中使用32位RAM上的64位窗口为变量分配大量数据(这里是4GB)。这里是参考代码。
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
double** Allocate(int d1,int d2);
double** Allocate(int d1,int d2)
{
double **m;
int i,j;
m = (double**)malloc(sizeof(double*)*d1);
for(i=0;i<d1;i++)
{
m[i]=(double*)malloc(sizeof(double)*d2);
}
for(i=0;i<d1;i++)
{
for(j=0;j<d2;j++)
{
m[i][j]=0.0;
}
}
return m;
}
main()
{
int i,j;
int n=2.2e4;
double** A= Allocate(n,n);
printf("Memory allocation successful");
}
答案 0 :(得分:1)
您正在分配3e5*3e5 = 9e10
个双打,代表720 Go
假设双精度为8个八位字节。
答案 1 :(得分:0)
发布的程序在具有64位Windows和8GB RAM的计算机上运行良好。您拥有的RAM量与它无关,在需求分页的虚拟内存操作系统上,您的程序会分配地址空间。在开始使用地址空间之前不要使用RAM,当您将数组元素设置为0时就会发生。您永远不会耗尽RAM。
您无法分配地址空间的最明显原因是您的程序以32位模式运行。您必须为项目选择x64平台。如果你使用VS然后使用Build&gt;配置管理器&gt;有源解决方案平台组合框。从技术上讲,你可以使用/ LARGEADDRESSAWARE链接器选项使其在32模式下工作(将地址空间从2GB增加到4GB)但是没有任何实际意义。
您可以分配多少地址空间最终取决于页面文件的大小以及操作系统增长的速度。安装了32GB的RAM,你还没有接近这个限制。