为什么当我声明一个大小为 500 x 500 的双倍矩阵时会出现堆栈溢出?

Why do I get stack overflow when I declare a matrix of double of size 500 x 500?

我正在使用 Visual Studio 2015,当我声明这样的矩阵时

double m[500][500];

在到达函数 main 的第一行代码之前,我得到了堆栈溢出。
是不是内存不够?怎么办?

因为这样的矩阵需要大约 2MB 的堆栈内存,而堆栈大部分只有 1MB,所以会出现堆栈溢出。堆栈内存大小可以在您的链接器选项中更改(或者在创建线程时 - 至少在 WinAPI 下 - Windows),它没有在语言标准中定义。即使您设置了一个堆栈大小示例:3MB,您也永远不知道有多少可用 - 您的代码执行可能深入某些函数调用,这些函数调用也为其变量使用堆栈内存。

解决方案是使用动态内存(堆)- std::vector(对于 C++):

// Allocates one memory buffer on heap, automatically manages memory.
std::vector<double> m(500*500,0);
m[499 + 499 * 500]=12;

// Not very efficent, as it allocated 500 memory buffers for each row,
// your memory will not be alligned what might cause cache misses
std::vector<std::vector<double>> m2(500, std::vector<double>(500));
m2[499][499]=12;

或:

double * m = (double *) malloc (500*500*sizeof(double));
m[x + y * 500] = 1;
free(m);

如果你想在 C 下使用它,它也可以在 C++ 下工作,但不鼓励

矩阵需要从堆中分配。对于 C 使用 malloc,对于 C++,使用 new。如果您的编译器可以选择使用更大的堆栈大小,那将是一个替代方案。