初始化2d数组时的Segfault

时间:2012-10-12 23:06:59

标签: c arrays pointers multidimensional-array

我在这个简单的数组初始化中找不到什么问题。 该程序在field[x][y] = ' ';上发生段错误,x和y在0处崩溃(我使用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 个答案:

答案 0 :(得分:1)

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

char*演员可能?

答案 1 :(得分:1)

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

但我的问题已经解决了。谢谢大家,对不起......#/ p>

答案 2 :(得分:0)

不应该是这个吗?

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

修改

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

答案 3 :(得分:0)

在初始化field_width之前,它可能包含随机数据。在field_width语句中使用malloc,然后triggered undefined behavior。编译器可以做任何想做的事情,从跳过malloc到使用field_width中存储的任何垃圾,甚至更糟/更奇怪的东西!无论如何,你不可能得到你想要的malloc电话,如果它没有运行或返回NULL(例如,如果field_width包含的值太大而不能{ {1}} ed),malloc的结果值不太可能指向有效的内存。当您在循环中取消引用field时,这将导致段错误。你很幸运,你有一个明确的迹象表明出现了问题 - 记忆错误并不总是那么明显。