我有一个名为Game的结构,其中包含一系列级别,定义如下:
typedef struct
{
Level levels[x];
} Game;
编译代码时,如果x为1,2或3,程序运行正常。如果它是任何其他值(例如4),我会得到分段错误。我不是在任何地方访问阵列。 Main就是这样的东西(除了初始化之外的一切评论):
int main (...)
{
Game g;
return 0;
}
这可能是什么的任何线索?
提前致谢。
答案 0 :(得分:5)
如果Level类/ struct非常大,你可以尝试使用它:
typedef struct {
Level *levels;
} Game;
然后使用malloc()或new分配您的级别。或者如果你真的需要一系列关卡:
typedef struct {
Level* levels[NUM_LEVELS];
} Game;
然后用这样的东西分配等级:
// Allocate levels
int i;
for(i=0;i<NUM_LEVELS;i++) {
gameStruct.levels[i] = (Level*)malloc(sizeof(Level));
initLevelNum(gameStruct.levels[i], i);
}
答案 1 :(得分:4)
Level
有多大?你的堆栈有可能溢出吗?鉴于(显然)只有一个Game对象,或许你最好使用static
存储类,如:static Game g;
编辑:如果你想在堆上强制分配,我建议使用糟糕 - 错过了它被标记为C,而不是C ++。 std::vector<Level> levels;
而不是直接使用指针。
答案 2 :(得分:4)
在我的机器上,这段代码
typedef struct {
char data[65536*4];
} Level;
typedef struct
{
Level levels[4];
} Game;
int main (...)
{
Game g;
return 0;
}
崩溃,但如果我将levels
数组的大小更改为3
则不会崩溃。
您应该减小Level
类型的大小(通过将数据放在堆而不是堆栈上)或将您的级别放在堆上(通过将它们保存在指针数组中动态分配Level
个对象)。
答案 3 :(得分:0)
如果你确实拥有数据的大小并且坚持分配堆栈,那么设置链接器上的堆栈大小可能是一种选择。如果我错了,请纠正我,因为我觉得这个主题很有趣
答案 4 :(得分:0)
通常,在类似情况下,您必须声明变量static:
int main(void) {
static struct foo bar[SIZE];
return 0;
}
因此,变量将在编译时分配并插入静态区域。