簡體   English   中英

分配復合結構時C程序崩潰

[英]C program crashes when allocating compound structure

操作系統:Windows 7,Compiler:GCC 3.2.3(MinGW)

我在C中創建了這三個數據結構:

#define MAP_NAME_LEN    30
#define MAP_W           25
#define MAP_H           19
#define WORLD_W         32
#define WORLD_H         32

typedef unsigned char byte;

typedef struct Tile
{
    byte type;
    byte character;
    byte fgColor;
    byte bgColor;
};

typedef struct Map
{
    char name[MAP_NAME_LEN];
    Tile overlay[MAP_H][MAP_W];
    Tile underlay[MAP_H][MAP_W];
};

typedef struct World
{
    Map area[WORLD_H][WORLD_W];
};

當我嘗試創建Tile和/或Map的單個實例時,沒關系,一點問題都沒有,一切正常。 但是,如果我嘗試創建一個世界,例如...

int main()
{
    World world;
}

...該程序只是崩潰(Windows 7表示該程序已崩潰並正在尋找解決方案,等等)。 你們知道為什么會這樣嗎?

謝謝!

根據MAP_NAME_LENMAP_HMAP_WWORLD_HWORLD_W ,您可能已經在堆棧上創建了MASSIVE結構。 不要那樣做 堆棧相對較小,通常不能處理總大小超過幾兆字節的分配(並且通常一次只能處理幾十個千字節)。 鑒於您的常量值,你很可能是反對這些限制跑起來-你的World結構幾乎是4MB大,太大了合理放在堆棧上。

因此,可以使用malloc或作為全局或文件本地靜態變量在堆上分配它:

World world;

int main()
{
    /* ... */
}

要么

int main()
{
    World *world = malloc(sizeof(*world));
    /* ... */
    free(world);
}

我最好的猜測是您的World對象超過了最大堆棧大小。 這取決於您如何定義MAP_NAME_LENMAP_HMAP_WWORLD_HWORLD_W

World結構的總大小至少為: WORLD_H * WORLD_W * (MAP_H * MAP_W * 2 * sizeof(Tile) + MAP_NAME_LEN) (加上編譯器可能插入的任何填充)。

編輯

現在,您已經添加了常量,您可以計算出數據結構將消耗約3.5MB(如果sizeof(Tile) == 4 )。 對於堆棧而言,這太多了。 默認堆棧大小通常約為1MB。 使用malloc在堆上分配數據結構。

當您對一個結構體進行typedef命名時,您必須給出一個名稱,語法為typedef struct foo { /* ... */ } Foo; (foo標簽是可選的)。

立即編輯 ,隨着大小的變化,很可能是堆棧溢出。 Map僅占用4KB的空間,因此World接近4MB。 據我所知,Windows僅提供了一個較小的堆棧(可能是1MB?)。

默認堆棧大小 (無論如何使用VS2010)為1MB。

sizeof(World) == 3921920 ,大於1MB的3倍以上。

您看到的崩潰是堆棧溢出。

您可以嘗試增加堆棧的大小(請參閱有關如何執行此操作的鏈接)或在堆上分配World對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM