c-这个分段错误的原因是什么



考虑以下片段:

void init ()
{
int i,j;
ioctl(0, TIOCGWINSZ, &w);
  X=w.ws_col;
  Y=w.ws_row - 9;
  printf("X=%d,Y=%dn",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 terrainn"); //OK
Terrain[6][0]=getch();
  printf("%xn",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:%dn",i,j);Terrain[i][j] = '#';printf(" '#'OKn");} //seg fault in this line for i=6,j=0
            else
                {printf("%d:%dn",i,j);Terrain[i][j] = ' ';printf(" '_'OKn");}
        }
        printf("%d:%d",i,X-1);
        Terrain[i][X - 1] = '';printf(" 'o'OKn");
    }
}

输出是这样的。。。

下午5:141

'_'OK

下午5:142

'#'打开

5:143'好

上午6:0

分段故障(堆芯转储)

dipto@dipto-VirtualBox:~$

如果我使用相同大小的静态数组,即144和32,则没有问题。
我是错过了什么还是忽略了什么?

您没有显示关键变量,如X,尤其是Y。

在分配内存时,通常需要一个乘法器来计算数组中每个成员的字节大小。"空头"通常需要2。"int"现在很棘手,可以是4或8。类似Terrain=malloc(Y*sizeof(Terrain[0]))的东西。

如果没有乘数,你就无法分配足够的内存,你的生存取决于内存是如何分配的,以及当你超过实际内存的末尾时,什么会被践踏。

相关内容

  • 没有找到相关文章

最新更新