[英]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_LEN
, MAP_H
, MAP_W
, WORLD_H
和WORLD_W
,您可能已經在堆棧上創建了MASSIVE結構。 不要那樣做 堆棧相對較小,通常不能處理總大小超過幾兆字節的分配(並且通常一次只能處理幾十個千字節)。 鑒於您的常量值,你很可能是反對這些限制跑起來-你的World
結構幾乎是4MB大,太大了合理放在堆棧上。
因此,可以使用malloc
或作為全局或文件本地靜態變量在堆上分配它:
World world;
int main()
{
/* ... */
}
要么
int main()
{
World *world = malloc(sizeof(*world));
/* ... */
free(world);
}
我最好的猜測是您的World
對象超過了最大堆棧大小。 這取決於您如何定義MAP_NAME_LEN
, MAP_H
, MAP_W
和WORLD_H
, WORLD_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.