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

时间:2014-07-10 06:55:56

标签: c++ c data-structures

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

有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:4)

结构DST包含12B个数据。开启memory alignment后(并设置为default value - 8B),每个实例需要16B

300*300*16B = 1440000B = ~1.4MB

声明为get allocated on the stack的本地变量,而Visual Studio的the default stack size1MB,错误是合适的。

要解决此问题,您可以增加堆栈大小/F 2000000我不认为这是设置更大堆栈的良好做法),或者更确切地说是分配堆上的内存使用:

答案 1 :(得分:2)

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的东西都会让你觉得“这真的应该放在堆栈上,还是应该做其他事情”。

答案 2 :(得分:0)

由于你键入了结构体,因此在初始化时不需要使用struct关键字,但是你需要为它命名。看起来应该是这样的:

typedef struct DST
{
    float salary;
    float x1;
    float x2;
} DST;

DST person[300][300];

此外,由于你没有使用malloc分配它,它被分配到堆栈中,所以一旦你离开你宣布它的功能,你就不能再访问它了

答案 3 :(得分:0)

这是在stackoverflow上询问的 问题。

与其他答案中提到的两个解决方案一起 - 在堆上分配数组或增加堆栈大小,还有第三个。

如果您定义数组static或在全局范围内,它将在程序数据段中创建。

对于简单的概念证明程序,这可能是最简单的解决方案。 此外,它可能会在某些(旧的,简单的)编译器上生成最快的代码。

总的来说,这不是好风格。

只需将您的定义从功能定义剪切并粘贴到文件范围....

答案 4 :(得分:0)

谢谢大家。 :)

老实说,我在记忆操作方面很差。看看各种可能的解决方案,我意识到我还没有学到很多东西。

这些答案解决了我的问题。

建议了多种可能的解决方案。

目前我使用过:使用std :: vector

std::vector<std::vector<DST>> person(300);
for(int i = 0; i < 300; i++) 
person[i].resize(300);  

这绝对没问题。

我将探索所有其他解决方案并开展工作。 谢谢