简单数组导致异常

时间:2011-01-07 19:59:18

标签: c++ visual-studio-2010

#include "stdafx.h"

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

    return 0;
}

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

4 个答案:

答案 0 :(得分:7)

你的数组太大而无法放在堆栈上。您没有足够的堆栈空间用于1000 * 1000元素。

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

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

这将为您提供浮动的二维向量,每个向量包含1000个元素。

另见:Segmentation fault on large array sizes

答案 1 :(得分:1)

float是4个字节,所以4 * 1000 * 1000 = 4兆字节。

“堆栈大小默认为1 MB”

见这里:http://msdn.microsoft.com/en-us/library/tdkhxaks(v=VS.100).aspx

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

只需声明您的数组静态:

static float x[1000][1000];

已编辑添加:

叹息另一个沉默的downvoter。不是我很惊讶。这显然是OP问题最简单的解决方案,因此它违反了OOP Komissariat的主要原则:最简单的解决方案总是错误的。