C++ 巨大数组中的访问冲突?

C++ 巨大数组中的访问冲突?,c++,visual-studio,C++,Visual Studio,这是我的密码: constexpr auto array_size = 50000000; double M[array_size][2][20]= { }; int main() { for (int n = 0; n < array_size; n++) printf("%d %f\n",n, M[n][0][0]); } 当n打印到大约150时,该程序崩溃 我在M[90]中也看到异常值,它类似于38672163832163812633812386113

这是我的密码:

constexpr auto array_size = 50000000; 
double M[array_size][2][20]= { };


int main()
{
    for (int n = 0; n < array_size; n++)
        printf("%d %f\n",n, M[n][0][0]);
}
当n打印到大约150时,该程序崩溃

我在M[90]中也看到异常值,它类似于38672163832163812633812386113


超长数字。

Visual studio通常不允许您分配大于0x7fffffff字节的数组,错误如下:

error C2148: total size of array must not exceed 0x7fffffff bytes
我猜在这种情况下,有一个编译器错误阻止了对超大数组的检测,并且数组没有正确初始化

改为使用std::vector并在堆上分配数组:

#include <stdio.h>
#include <vector>

constexpr auto array_size = 50000000;

int main()
{
    std::vector < std::vector< std::vector< double > > > M( array_size, std::vector< std::vector< double > >( 2, std::vector< double >( 20 ) ) );
    for (int n = 0; n < array_size; n++)
        printf("%d %f\n", n, M[n][0][0]);
}

请注意,这将使用超过最低要求的16GB内存,如果您确实需要一次将所有数据存储在内存中,则一维向量可能更有效。

可能是某些bss节限制。在任何情况下,静态格式的大数据都是不好的,使用std::vector.M将占用近15G的空间。我不确定您是否希望将其烘焙到可执行文件中。我需要一个非常大的数组,它们在运行时init中都计算为0。@LindaLambie这对是真的,但对不是。对于可变参数,通常,当作为参数传递时,float总是转换为double。看见请注意,scanf需要地址,而printf需要值来处理浮点。您的平台是什么?Windows还是Linux?32位还是64位?我的电脑是16GB内存,Windows 10,我在程序中测试了这种方法将数组替换为向量,Windows最终挂起并使用了所有16GB内存,可能它仍在工作,但屏幕变黑,没有响应…等等。Linux会更好地处理这个问题吗?是的,Linux应该更好,因为它不会为只包含零的页面分配内存,请注意,当您开始将值放入向量时,您仍然会遇到相同的问题。如果您只有16GB的ram,那么尝试在内存中操作16GB总是会遇到问题。您需要研究另一种方法,例如内存映射文件。我在同样具有16GB内存的机器上测试了上述方法,经过一些交换操作后,它最终成功了