创建结构的二维数组会导致崩溃

时间:2013-09-20 18:19:25

标签: c++ arrays struct

我正在尝试生成struct的二维数组,但这会导致程序无法启动。窗口冻结,程序在几秒钟后退出。知道为什么吗?

这是我尝试定义数组cells的文件。

#ifndef _FIELD_H_
    #define _FIELD_H_

class Field {
    public:
        static const int minX = -400;
        static const int maxX = 400;
        static const int minY = 0;
        static const int maxY = 400;

        Field();

    private:
        struct absCell {
            int material;
            float health;
        } cells[maxX - minX + 1][maxY - minY + 1];
};

#endif

当我删除这四行时,程序能够运行:

        struct absCell {
            int material;
            float health;
        } cells[maxX - minX + 1][maxY - minY + 1];

知道这是怎么回事吗?任何帮助表示赞赏!

更新

好吧,显然问题是这个阵列变得非常大。也许你可以帮助我优化它。

材质必须是0到10之间的int。 健康必须是介于0和1之间的浮点数,最多为2个小数位。

如何限制这些变量的大小?

更新2

Mark B建议使用vectors,而itwasntpete建议使用指针,new和delete。差异在哪里,这两种方法的优点和缺点是什么?再次感谢!

4 个答案:

答案 0 :(得分:4)

您正在堆栈上分配struct absCell的801 * 401(= 321201)个元素。假设您有32位机器,它是2569608字节(~2.45 MB)。这会炸毁你的筹码。见here

将元素移动到堆,如:

class Field {
public:
    static const int minX = -400;
    static const int maxX = 400;
    static const int minY = 0;
    static const int maxY = 400;

    Field() {
        cells = new absCell*[maxX - minX + 1];
        for(int i=0; i<maxX - minX + 1; i++)
            cells[i] = new absCell[maxY - minY + 1];
    }

    ~Field() {
        for(int i=0; i<maxX - minX + 1; i++)
            delete[] cells[i];

        delete[] cells;
    }

private:
    struct absCell {
        unsigned char material;
        unsigned char health;
    }**cells;
};

应该解决你的问题。

因为您的更新资料和运行状况可以保存在char中。访问健康,你必须重新计算它:

put -> x*100
get -> x/100

并且别忘了施展它。

答案 1 :(得分:3)

基于更新说明:

您可以做的第一件事就是使用unsigned char为每个属性轻松优化结构空间,使用现有浮点数的定点表示法(例如,0.23将存储为整数23)。

然后使用vector而不是数组将结构存储在堆上:

    struct absCell {
        unsigned char material;
        unsigned char health;
    };
    std::vector<std::vector<absCell> > cells_;

然后设置构造函数:

Field() : cells_(maxX - minX + 1, std::vector<absCell>(maxY - minY + 1)) {}

答案 2 :(得分:2)

我的猜测是你达到了堆栈限制。当您创建该数组时,它试图在您的堆栈上放置801 * 401 * 8字节。我做了一个快速编译并且崩溃了,直到我降低了你的各种分数和最大值的数字。

答案 3 :(得分:2)

如果我正确地获得了你的代码片段,那么你正在尝试创建一个数组。阵列的分配是基于堆栈的,需要超过2 Mb的大小。您的堆栈可能有少于2Mb的可用内容,因此代码在您进入函数时就崩溃了。

尝试以dinamically方式分配相同的数组。