无法创建数组大小 [300][300] 的二维数据结构 - >堆栈溢出

Unable to Create a 2d data structure of array size [300][300]-->Stack Overflow

本文关键字:数据结构 二维 栈溢出 堆栈 gt 数组 创建      更新时间:2023-10-16

我想创建[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