C++静态数组声明

C++ static array declaration

本文关键字:声明 数组 静态 C++      更新时间:2023-10-16

当我运行以下代码时,出现堆栈溢出。怎么可能?我想如果我在 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("%lft",large_array[30][6][5]);
}

这有一个问题是,编译器想要存储数组的位置很可能没有空间容纳那么多内存——在某些环境中,必须在堆上完成非常大的分配,例如使用 mallocnew 或其他类似方式(或隐式通过这些方式,例如由 std::vector 在内部完成)。

您声明的三维全局数组消耗了太多内存(~1043456KB.i.e.e..~1GB) 在编译时初始化时heap,这就是您的程序出现溢出问题的原因。
处理此问题的一种直观方法是使用多维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("%lft",large_array[30][6][5]);
}

静态分配数组的最大大小由程序可以访问的内存量决定。在 32 位系统上,指针可以寻址的最大内存量为 2^32 字节,即 4 GB。实际限制可能更少,具体取决于操作系统实现详细信息和编译器实现选择。

正如interjay在评论中所说,您的分配需要相当多的空间。

在C++中,您应该使用提供的容器(如向量或 boost 多维数组)来处理这种情况。