C 大小非常大的数组的分配

C 大小非常大的数组的分配,c,arrays,dynamic-arrays,C,Arrays,Dynamic Arrays,如何创建一个大小非常大的数组??我无法创建一个INT_MAX大小的数组。。我们怎样才能做到这一点 #include <stdio.h> #include <stdlib.h> #include <limits.h> #define SIZE 2147483647 int main() { int *array; unsigned int i; array = malloc(sizeof(int) * SIZE);

如何创建一个大小非常大的数组??我无法创建一个INT_MAX大小的数组。。我们怎样才能做到这一点

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define SIZE 2147483647

int main() {    
   int *array;    
   unsigned int i;

   array = malloc(sizeof(int) * SIZE);    
   if(array == NULL)    {
      fprintf(stderr, "Could not allocate that much memory");
      return 1;    }

   for(i=0; i<1; i++)    {
      array[0] = 0;    
   }    

   free(array); 
}
#包括
#包括
#包括
#定义大小2147483647
int main(){
int*数组;
无符号整数i;
数组=malloc(sizeof(int)*大小);
if(数组==NULL){
fprintf(stderr,“无法分配那么多内存”);
返回1;}

对于(i=0;i您正在创建一个最小4GB大小的数组。您确定您有那么多的可用内存吗?

您正在创建一个最小4GB大小的数组。您确定您有那么多的可用内存吗?

您几乎肯定达到了平台限制。如果您只有32位地址空间,4G就是您希望寻址的最大容量。实际上,因为部分地址空间将被其他事物占用,所以它将少得多

使用64位地址空间,这是可能的,但是,一旦您达到该分配级别,您应该问问自己是否确实有必要这样做

解决这个问题的一种方法是使用内存不足的存储,如磁盘,只将需要的东西放入内存

换句话说,将数据结构分成(例如)1M个块,并一次处理1M个块

根据数据结构的使用模式,可以使用大量的缓存算法来有效地执行此操作


例如,对于真正的顺序访问,您可以一次在内存中有一个数据块。对于真正的随机访问,您可能希望在缓存场景中一次在内存中有几个数据块-每个内存中结构都存储1M的数据及其在内存不足存储中的位置,因此您可以使用LRU算法并写回脏数据ta等等。

您几乎肯定达到了平台限制。如果您只有32位地址空间,4G就是您希望的地址空间。事实上,由于部分地址空间将被其他东西占用,因此4G的容量将大大减少

使用64位地址空间,这是可能的,但是,一旦您达到该分配级别,您应该问问自己是否确实有必要这样做

解决这个问题的一种方法是使用内存不足的存储,如磁盘,只将需要的东西放入内存

换句话说,将数据结构分成(例如)1M个块,并一次处理1M个块

根据数据结构的使用模式,可以使用大量的缓存算法来有效地执行此操作


例如,对于真正的顺序访问,您可以一次在内存中有一个数据块。对于真正的随机访问,您可能希望在缓存场景中一次在内存中有几个数据块-每个内存中结构都存储1M的数据及其在内存不足存储中的位置,因此您可以使用LRU算法并写回脏数据ta等等。

您的第一个问题不是分配本身,而是看似简单的表达式
sizeof(int)*SIZE
。如果
int
有4个字节,则该操作的结果为
0x1ffffffffc
。这需要33位来表示。如果您的平台只有
SIZE\t
类型的32位,则乘法的结果会环绕(
SIZE\t
无符号)并给出
0xFFFFFFFC


如果您刚才在调用malloc时使用了上面的33位值,编译器可能会告诉您该数字不可表示。

您的第一个问题不是分配本身,而是看似简单的表达式
sizeof(int)*SIZE
。如果
int
有4个字节,则该操作的结果为
0x1ffffffffc
。这需要33位来表示。如果您的平台只有
SIZE\t
类型的32位,则乘法的结果会环绕(
SIZE\t
无符号)并给出
0xFFFFFFFC


如果您刚才在调用malloc时使用了上面的33位值,编译器可能会告诉您该数字不可表示。

到目前为止,每个人都在试图回答您的问题,但我想采取另一种方法。根据我的经验,您实际上很少需要您尝试的类型/大小的数组在不创建如此庞大的结构(解析数组、堆栈、队列、映射)的情况下,通常还有其他方法来做您需要的事情

我很好奇你想用这个阵列做什么…我打赌如果我们了解你试图解决的问题,你实际上并不需要它

另一方面,如果这是一项智力活动(比如我能分配多大),那么也有办法回答这类问题


如果你想玩……你真正想要完成的是什么?

到目前为止,每个人都在试图回答你的问题,但我想采取另一种方法。根据我的经验,你实际上很少需要一个你试图分配的类型/大小的数组。通常有其他方法来做你需要的事情我们需要创建这样一个庞大的结构(解析数组、堆栈、队列、映射)

我很好奇你想用这个阵列做什么…我打赌如果我们了解你试图解决的问题,你实际上并不需要它

另一方面,如果这是一项智力活动(比如我能分配多大),那么也有办法回答这类问题


如果你想玩……你真正想做的是什么?

比可用内存更重要的是地址空间。如果你的机器没有足够的每个指针位来访问数组的特定索引,那么你是否有足够的可用内存就无关紧要了(而且虚拟内存使可用内存几乎成为一个没有意义的点).但是如果没有足够的地址空间,这不意味着操作系统没有足够的可用空间。我们的答案不一样吗?也许我应该