分段故障问题(C)

时间:2010-05-14 16:21:46

标签: c segmentation-fault

我有一个名为Game的结构,其中包含一系列级别,定义如下:

typedef struct 
{
     Level levels[x];
} Game;

编译代码时,如果x为1,2或3,程序运行正常。如果它是任何其他值(例如4),我会得到分段错误。我不是在任何地方访问阵列。 Main就是这样的东西(除了初始化之外的一切评论):

int main (...)
{
     Game g;

     return 0;
}

这可能是什么的任何线索?

提前致谢。

5 个答案:

答案 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;

编辑:如果你想在堆上强制分配,我建议使用std::vector<Level> levels;而不是直接使用指针。糟糕 - 错过了它被标记为C,而不是C ++。

答案 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;
}

因此,变量将在编译时分配并插入静态区域。