我想创建[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
有人可以帮我解决这个问题吗?
答案 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 size为1MB
,错误是合适的。
要解决此问题,您可以增加堆栈大小/F 2000000
(我不认为这是设置更大堆栈的良好做法),或者更确切地说是分配堆上的内存使用:
std::vector<std::vector<DST>>
会这样做)new
malloc()
(C)答案 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);
这绝对没问题。
我将探索所有其他解决方案并开展工作。 谢谢