C++静态数组声明
C++ static array declaration
当我运行以下代码时,出现堆栈溢出。怎么可能?我想如果我在 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]);
}
这有一个问题是,编译器想要存储数组的位置很可能没有空间容纳那么多内存——在某些环境中,必须在堆上完成非常大的分配,例如使用 malloc
、new
或其他类似方式(或隐式通过这些方式,例如由 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 多维数组)来处理这种情况。
相关文章:
- 在类c++中使用new声明数组
- 为什么不能用常量表达式声明数组?
- 声明数组后我无法添加数组
- 可以使用<size_t>static_const(),std::as_const()或static_cast<const size_t>()来声明数组吗?
- 变量未在此范围内声明 数组线性搜索
- 在类中声明数组. C++
- T D[N] 总是声明数组类型的对象吗?
- 如何使用智能指针在二维上声明数组?
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 在C 类中声明数组数据
- 声明数组时出现 SIGSEGV 错误,而不创建新的 int[size]
- 如何在不初始化常量的情况下声明数组?
- 使用函数在函数中声明数组值
- 以C++声明数组的时间复杂度
- 通过传递数组长度在函数内声明数组
- 通过引用传递数组,而不在函数声明中显式声明数组的大小
- 声明数组和打印[错误?]
- 用内核参数在CUDA内核中声明数组
- 如何在不依赖#Define的情况下转发声明数组大小
- 声明数组已经填充了零