无法创建数组大小 [300][300] 的二维数据结构 - >堆栈溢出
Unable to Create a 2d data structure of array size [300][300]-->Stack Overflow
我想创建[300][300]的2d数据结构,但是我得到堆栈溢出错误。
我是这样定义的
typedef struct DST
{
float salary;
float x1;
float x2;
};
struct DST person[300][300];
我得到一个错误的上述声明。
但是,如果我声明struct DST person[300][70];
->这是正常工作的
所以,这是一个内存处理问题,我无法解决它。
软件:Visual Studio 2010
有人能帮我解决这个问题吗?结构DST
包含12B
的数据。当内存对齐打开时(并设置为默认值- 8B
),它为每个实例取16B
。
300*300*16B = 1440000B = ~1.4MB
像这样声明的局部变量在堆栈上被分配,由于Visual Studio的默认堆栈大小是1MB
,因此错误是适当的。
要解决这个问题,您可以增加堆栈大小/F 2000000
(我不认为设置更大的堆栈是好的做法),或者使用
- std::containers (
std::vector<std::vector<DST>>
可以) -
new
-
malloc()
(c) - WinAPI分配方法之一 (C)
300 * 300 * 12字节刚好超过1MB。这是一个非常大的堆栈。
在c++中,简单的解决方案是使用std::vector
。std::vector<std::vector<DST>> person(300);
for(int i = 0; i < 300; i++)
person[i].resize(300);
这避免了直接使用new
(然后需要使用delete
)。
如果你有c++ 11编译器,你可以这样做:
std::vector<std::array<DST, 300>> person;
,从而避免循环调整大小。
请注意,尽管可以"请求更大的堆栈",但不应该真正用于在堆栈上分配单个大型数据结构。当您有很多调用级别时,更大的堆栈是必要的,每个调用级别在堆栈上都有少量数据。任何比1KB大得多的东西都应该让您考虑"这真的应该放在堆栈上,还是我应该做其他事情"。
由于您对该结构进行了类型定义,因此在初始化它时不需要使用struct关键字,但需要给它一个名称。它应该看起来像这样:
typedef struct DST
{
float salary;
float x1;
float x2;
} DST;
DST person[300][300];
也因为你没有使用malloc分配它,它是在堆栈上分配的,所以一旦你离开了你声明它的函数,你就不能再访问它了
这是关于stackoverflow的问题。
除了在堆上分配数组或增加堆栈大小之外,还有第三种解决方案。
如果在全局作用域中定义了数组static
,它将在程序数据段中创建。
对于简单的概念证明程序,这可能是最简单的解决方案。此外,它可能在一些(旧的、简单的)编译器上生成最快的代码。
总的来说,这不是一个好的风格。
只需将函数定义中的定义剪切并粘贴到文件作用域....
谢谢大家。:)
老实说,我在记忆操作方面很差。寻找各种可能的解决方案,我意识到我还有很多东西要学。
这些答案解决了我的问题。
提出了多种可能的解决方案。
目前我使用:使用std::vector
std::vector<std::vector<DST>> person(300);
for(int i = 0; i < 300; i++)
person[i].resize(300);
这工作绝对很好。
我将探索所有其他解决方案并努力解决它。Thank You
- 带结构的二维矢量:如何存储元素
- 二维矢量数据成员
- 类C++中二维数组的结构
- 使用什么数据结构来存储基于游戏对象的二维单元地图?
- 用于在具有更新查询的二维矩阵中查找最大值的最佳数据结构
- C/C++中固定长度实输入数据的高效二维FFT
- 使用c/awk/shell对二维数据进行双线性插值
- 排序二维结构阵列
- 您将使用哪种数据模型在 QML 中制作二维字段 100*100
- 在二维结构数组C++遇到问题
- visual 将文件中的数据存储到C++中的二维数组中
- 结构的二维容器数组的构造函数
- 使用二维数组调用返回结构
- 将二维数组从数据文件传递给函数并输出内容
- 仅使用点云作为查询点的D维k近邻搜索的C++数据结构
- 有可能创建一个结构的二维矢量吗
- C++:创建结构的二维数组
- 如何在C++中为矢量数据结构中的二维数组获取用户输入,而不使用行和列上的两个for循环
- 无法创建数组大小 [300][300] 的二维数据结构 - >堆栈溢出
- 如何在动态二维数组中存储数据,在结构体中声明,该结构体也被c++中的另一个结构体使用