当我运行以下代码时,我得到堆栈溢出。这怎么可能?我想如果我在main之外定义一个数组,它将是静态的,我不会遇到内存问题?我该怎么办呢?
#include <stdio.h>
#define dim1 14001
#define dim2 14001
#define dim4 8
double large_array[dim1][dim2][dim4];
int main()
{
large_array[30][6][5] = 1337;
printf("%lf\t",large_array[30][6][5]);
}
答案 0 :(得分:2)
这有一个问题是编译器想要存储数组的地方很可能没有空间来容纳那么多内存 - 在某些环境中,非常大的分配必须在堆上完成,例如使用malloc
,new
或其他类似方式(或隐式通过这些方式,例如由std::vector
内部完成)。
答案 1 :(得分:0)
静态分配的数组的最大大小由程序可以访问的内存量决定。在32位系统上,指针可以寻址的最大内存量是2 ^ 32字节,即4千兆字节。实际限制可能更少,具体取决于操作系统实现细节和编译器实现选择。
正如interjay在评论中所说,您的分配需要相当多的空间。
在C ++中,您应该使用提供的容器(如vector或boost多维数组)来处理此类情况。
答案 2 :(得分:0)
在编译时初始化时,你声明的3-D全局数组在heap
上消耗了太多内存(~1043456KB.i.e ..~1GB),这就是你的程序出现溢出问题的原因。
处理此问题的一种直观方法是使用多维map
STL而不是多维全局数组。
#include<stdio.h>
#include<map>
/*#define dim1 14001
#define dim2 14001
#define dim4 8
double large_array[dim1][dim2][dim4];
*/
using namespace std;
map<double, map<double,map<double,double> > > large_array;
int main()
{
large_array[30][6][5] = 1337;
printf("%lf\t",large_array[30][6][5]);
}