我在这个简单的数组初始化中找不到什么问题。
该程序在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] = ' ';
}
}
知道我做错了什么?
答案 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
时,这将导致段错误。你很幸运,你有一个明确的迹象表明出现了问题 - 记忆错误并不总是那么明显。