0

如何创建一个非常大的数组?好吧,我无法创建一个大小为 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

4 回答 4

5

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

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

解决此问题的一种方法是使用内存不足的存储(例如磁盘),并且只将需要的内容放入内存。

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

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

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

于 2011-01-08T06:04:16.880 回答
1

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

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

于 2011-01-08T09:25:46.793 回答
0

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

于 2011-01-08T05:58:09.803 回答
-1

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

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

另一方面,如果这是一项智力练习(比如我可以分配多大的空间),也有一些方法可以回答这些问题。

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

于 2011-01-08T16:01:35.750 回答