【发布时间】:2013-12-14 12:43:22
【问题描述】:
考虑以下 sn-p:
void init ()
{
int i,j;
ioctl(0, TIOCGWINSZ, &w);
X=w.ws_col;
Y=w.ws_row - 9;
printf("X=%d,Y=%d\n",X,Y); // X and Y looks good, 144 and 32
getch();
Terrain=malloc(Y);
for(i=0;i<Y;i++)
Terrain[i]=malloc(X);
printf("Created terrain\n"); //OK
Terrain[6][0]=getch();
printf("%x\n",Terrain[6][0]); getch(); //No problem accessing Terrain[6][0]
for (i = 0; i < Y; i++)
{
for (j = 0; j < X-1; j++)
{
if ((i == 0) || (j == 0) || (j == (X - 2)) || (i == (Y - 1)))
{printf("%d:%d\n",i,j);Terrain[i][j] = '#';printf(" '#'OK\n");} //seg fault in this line for i=6,j=0
else
{printf("%d:%d\n",i,j);Terrain[i][j] = ' ';printf(" '_'OK\n");}
}
printf("%d:%d",i,X-1);
Terrain[i][X - 1] = '\0';printf(" 'o'OK\n");
}
}
输出是这样的......
...
5:141
'_'好的
5:142
'#'好的
5:143 'o'OK
6:0
分段错误(核心转储)
dipto@dipto-VirtualBox:~$
如果我使用相同大小的静态数组,即 144 和 32,则没有问题。
我是否遗漏或忽略了什么?
【问题讨论】:
-
应该是
Terrain=malloc(Y * sizeof(char *)) -
好的,但这没有帮助..
-
通过 gdb 运行它并获得回溯,以便您知道问题出在哪一行。在分配
Terrain[6]之前,不应访问Terrain[6][0]=getch();.. -
@amdixon,是的,
Terrain=malloc(Y * sizeof(char *))有效。我又犯了一个错误。非常感谢。
标签: c arrays segmentation-fault malloc