数组的大小分配非常大

时间:2011-01-08 05:55:01

标签: 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);    
   if(array == NULL)    {
      fprintf(stderr, "Could not allocate that much memory");
      return 1;    }

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

   free(array); 
}

4 个答案:

答案 0 :(得分:5)

你几乎肯定会达到平台限制。如果您只有32位地址空间,那么4G就是您希望解决的问题。实际上,由于地址空间的一部分将被其他东西占用,因此它将会少得多。

使用64位地址空间,但是,一旦达到该级别的分配,您应该问自己是否真的有必要。

解决问题的一种方法是使用磁盘等内存不足的存储空间,只将内存带入内存中。

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

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

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

答案 1 :(得分:1)

你的第一个问题不是分配本身,而是看似简单的表达sizeof(int) * SIZE。如果0x1FFFFFFFC有4个字节,则该操作的结果为int。这需要33位来表示。如果您的平台只有size_t类型的32位,则乘法结果将换行(size_t为无符号),并为您提供0xFFFFFFFC

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

答案 2 :(得分:0)

您正在创建一个至少4GB大小的数组。你确定你有那么多的免费记忆吗?

答案 3 :(得分:-1)

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

我很好奇你想用这个数组做什么。 。 。如果我们明白你要解决的问题,我打赌你实际上并不需要它。

另一方面,如果这是一项智力活动(比如我可以分配多大),也有办法回答这些问题。

如果你想玩。 。 。你实际上想要完成的是什么?