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

Mit*_*tin 3 c++ memory arrays 64-bit visual-studio

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

int distanceArray[282][9900000];
Run Code Online (Sandbox Code Playgroud)

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

Error   C2148   total size of array must not exceed 0x7fffffff bytes
Run Code Online (Sandbox Code Playgroud)

我的系统上有16GB的RAM,因此我知道我的物理内存应该不是问题。如果我的计算正确,则此空间仅会占用大约3GB。但是,我不明白为什么我似乎无法使64位编译器正常工作。我遵循了Microsoft网站上概述如何使用64位编译器的指示,但是无论我做什么,我都会收到相同的错误。任何帮助将不胜感激。谢谢!

我知道以前曾问过这个问题,但现有的答案对我没有帮助。感谢您为帮助我发现问题所做的任何尝试。

Ros*_*dge 6

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

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

int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000);
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望它具有更多的C ++效果,并且不需要像静态分配的数组那样将其初始化为零,则为:

int (*distanceArray)[9900000] = new int[282][9900000];
Run Code Online (Sandbox Code Playgroud)

  • 哎呀,为什么不建议使用`std::vector<std::vector<int>>`。毕竟它被标记为C++。 (2认同)

Mit*_*tin 3

正如 MSalters 所建议的,anstd::vector<std::vector<int>>绝对是最佳选择。

对于仍然遇到此问题的任何人,以下是我初始化它的方法:

std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1));
Run Code Online (Sandbox Code Playgroud)

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

感谢所有评论提供帮助的人!