错误:数组的总大小不得超过0x7fffffff字节

时间:2017-02-11 06:29:54

标签: c++ arrays visual-studio memory 64-bit

我有一个需要大型2d数组的小型C ++程序。

int distanceArray[282][9900000];

我知道标准的32位控制台应用程序由于32位应用程序的2GB上限而无法为我的进程分配这么多内存。但是,尽管我已将我的编译器配置为使用本机amd64工具集,但在尝试构建应用程序时仍然会出现相同的错误:

Error   C2148   total size of array must not exceed 0x7fffffff bytes

我的系统上有16GB的RAM,所以我知道我的物理内存应该不是问题。如果我的计算是正确的,这应该只占3GB左右。但是,我不明白为什么我似乎无法让64位编译器正常工作。我按照Microsoft's website上的说明概述了如何使用64位编译器,但无论我做什么,我都会收到同样的错误。任何帮助将不胜感激。谢谢!

我知道之前已经问过这个问题,但现有的答案对我没有帮助。感谢您帮助我找到问题的任何尝试。

2 个答案:

答案 0 :(得分:5)

Windows上使用的64位PECOFF可执行格式不支持创建负载大小超过2GB的可执行文件,因此您无法创建大于此值的静态分配对象。如果尝试使用自动分配的对象在堆栈上创建这样的对象,则会遇到类似的问题。

一种可能的解决方案是动态分配对象:

int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000);

或者,如果你想要更多的C ++,并且不需要将它初始化为零,就像静态分配的数组一样:

int (*distanceArray)[9900000] = new int[282][9900000];

答案 1 :(得分:1)

根据MSalters的建议,std::vector<std::vector<int>>绝对是可行的方法。

对于仍然遇到此问题的人,以下是我对其进行初始化的方法:

std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1));

在282项的每一行中创建9,000,000列,每个值在开始时初始化为-1。

感谢所有评论帮助的人!