大型动态2D数组分配失败-C语言

大型动态2D数组分配失败-C语言,c,arrays,C,Arrays,我试图在C中定义一个大的动态大小2D数组。当数组大小不是很大(例如20000 x 20000)时,内存分配工作正常。但是,当阵列大小大于50K x 50K时,内存分配失败。下面是示例代码 long int i = 0; int **Cf = calloc(30000, sizeof *Cf); for( i = 0; i < 30000; i++){ Cf[i] = calloc(30000, sizeof *(Cf[i]));} long int i=0; int**Cf=calloc

我试图在C中定义一个大的动态大小2D数组。当数组大小不是很大(例如20000 x 20000)时,内存分配工作正常。但是,当阵列大小大于50K x 50K时,内存分配失败。下面是示例代码

long int i = 0;
int **Cf = calloc(30000, sizeof *Cf);
for( i = 0; i < 30000; i++){
Cf[i] = calloc(30000, sizeof *(Cf[i]));}
long int i=0;
int**Cf=calloc(30000,尺寸*Cf);
对于(i=0;i<30000;i++){
Cf[i]=calloc(30000,sizeof*(Cf[i]);}

这篇文章解释了为什么会出现这个问题。但是,它并没有说明当您的程序中需要大型动态2D阵列时该怎么做。我相信应该有一种有效的方法来实现这一点,因为许多科学应用都需要这一功能。有什么建议吗

并非计算机上的所有可用内存都可以作为程序的单个可分配块使用。这里重要的不是RAM,而是虚拟地址空间。在32位系统上,地址空间不能超过4GB(实际上,由于保留块、碎片等原因,地址空间会减少)。TG的可能副本代码中没有2D数组
int**
不是二维数组,不能表示一个数组或点对一数组。如果要使用2D数组,请使用指向1D数组的指针。FWIW:50k*50k
long
是POSIX64系统上的20GB内存,即2.5G元素。你认为它是多少米?为什么这不起作用呢?是的,它可能会失败。电脑可能会爆炸,你可能会感冒。你的键盘可能会坏。我不明白你的意思。旁注:指针指针使用的内存比2D数组要多得多。计算机上可用的内存不是全部都可以作为程序的单个可分配块使用。这里重要的不是RAM,而是虚拟地址空间。在32位系统上,地址空间不能超过4GB(实际上,由于保留块、碎片等原因,地址空间会减少)。TG的可能副本代码中没有2D数组
int**
不是二维数组,不能表示一个数组或点对一数组。如果要使用2D数组,请使用指向1D数组的指针。FWIW:50k*50k
long
是POSIX64系统上的20GB内存,即2.5G元素。你认为它是多少米?为什么这不起作用呢?是的,它可能会失败。电脑可能会爆炸,你可能会感冒。你的键盘可能会坏。我不明白你的意思。作为旁注:指针比2D数组占用更多的内存。