C++ 简单数组导致异常

C++ 简单数组导致异常,c++,visual-studio-2010,C++,Visual Studio 2010,我得到“s.exe中0x01341637处的第一次机会异常:0xC00000FD:堆栈溢出”。为什么?您的数组太大,无法放入堆栈。您没有足够的堆栈空间容纳1000*1000元素 您需要在堆上分配数组。您可以使用new关键字执行此操作,但更简单的方法是只使用std::vector #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { float x[1000][1000]; return 0; } std::向量

我得到“s.exe中0x01341637处的第一次机会异常:0xC00000FD:堆栈溢出”。为什么?

您的数组太大,无法放入堆栈。您没有足够的堆栈空间容纳
1000*1000
元素

您需要在堆上分配数组。您可以使用
new
关键字执行此操作,但更简单的方法是只使用
std::vector

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    float x[1000][1000];

    return 0;
}
std::向量浮动(1000);
对于(无符号i=0;i!=floats.size();++i)floats[i]。调整大小(1000);
这将为您提供一个二维浮点向量,每个向量包含1000个元素


另请参见:

浮点值为4字节,因此4*1000*1000=4兆字节

“堆栈大小默认为1 MB”


请参见此处:

如其他人所述,对象的大小大于为函数堆栈帧定义的(默认)大小。有两种解决方案:1)在堆上创建一个可能更大的对象;或者2)增加函数堆栈帧大小,这在32位环境中可能会有问题,因为可能会耗尽可寻址空间,但可以轻松地在64位中完成。

只需将数组声明为静态:

std::vector<std::vector<float> > floats(1000);
for (unsigned i = 0; i != floats.size(); ++i) floats[i].resize(1000);
编辑以添加:


又一个沉默的选民叹了口气。我并不感到惊讶。这显然是OP问题的最简单解决方案,因此它违反了OOP Komissariat的基本原则:最简单的解决方案总是错误的。

@HPT-一个解决方案是使用动态分配的内存,或者使用向量向量之类的东西。您也可以使用动态数组的静态数组(也称为指针数组)。请注意,动态数组在内存中是不连续的。您也可以将数组设为静态数组。这应该没问题。当库为您编写循环时,不需要编写循环:std::vector floats(1000,std::vector(1000,0.0))@托尼克:以我的经验来说不是。它通常只会导致更多的东西四处移动,直到它起作用。重复以上步骤,直到移动内容不再起作用,这时“程序员”通常会放弃。阅读以下内容:另外:实际上,您可能应该使用某种动态容器,如@birryee所建议的。大约3.8兆字节。假设sizeof(float)==4,这也假设您使用的是Windows和MSVC。
static float x[1000][1000];