0

我找不到这个简单的数组初始化有什么问题。field[x][y] = ' ';程序在 0 时出现段错误,x 和 y崩溃(我使用 Code::Blocks 调试器)

/* init data structures */
char **field;
int field_width=5,field_height=5;
field = malloc(sizeof(char*)*field_width);
for(x=0;x<field_width;x++)
{
    field[x] = malloc(sizeof(char)*field_height);
    for(y=0;y<field_height;y++)
    {
        field[x][y] = ' ';
    }
}

知道我做错了什么吗?

4

4 回答 4

1
field = (char*) malloc(sizeof(char*)*field_width);

可能是char*演员表?

于 2012-10-12T23:15:51.807 回答
1

我实际上简化了代码片段。field_width未初始化。我很惊讶这在构建过程中没有发出警告。而且我真的不知道为什么当x = 0时它会产生段错误。

但是我的问题解决了。谢谢大家,很抱歉给您带来的方便...

于 2012-10-12T23:34:14.110 回答
0

不应该是这个吗?

field = (char**)malloc(sizeof(char*)*field_width);

编辑

malloc可以返回 null,因此检查field[x] = malloc(sizeof(char)*field_height);内存块是否有效是值得的。

于 2012-10-12T23:21:20.070 回答
0

在初始化之前field_width,它可能包含随机数据。field_widthmalloc语句中使用然后触发未定义的行为。编译器可以做它想做的任何事情,从跳过malloc到使用碰巧存储在 中的任何垃圾field_width,甚至更糟/更奇怪的事情!无论如何,您不太可能得到malloc您想要的调用,并且如果它没有运行或返回NULL(例如,如果field_width包含一个太大而无法malloc编辑的值),则结果值field不太可能指向有效内存。field当您在循环中取消引用时,这将导致段错误。你很幸运,你得到了如此明显的迹象表明出了什么问题——记忆错误并不总是那么明显。

于 2012-10-13T02:38:41.227 回答