2013-12-14 46 views
1

考慮下面的代碼片段:這種分段故障的原因是什麼?

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

「_'OK

5:142

'#' OK

5:143「o'OK

6:0

分割故障(核心轉儲)

dipto @ dipto-VirtualBox的:〜$

如果我使用相同大小的靜態數組(即144和32),則沒有問題。
我是否缺少或忽略了某些內容?

+3

應該是'Terrain = malloc(Y * sizeof(char *))' – amdixon

+0

好吧,但這並沒有幫助.. – Dipto

+0

通過gdb運行它並獲得回溯,以便您知道哪一行是問題所在。也是'Terrain [6] [0] = getch();'直到分配了'Terrain [6]'後才能被訪問...... – amdixon

回答

3

你沒有表現出關鍵變量,如X,特別是Y.

當分配的內存,你通常需要一個乘數佔陣列中的每個成員的字節大小。 「短」通常需要2.「int」這些天很棘手,可以是4或8。沿着Terrain=malloc(Y*sizeof(Terrain[0]))行。

如果沒有乘法器,您不會分配足夠的內存,而且您的生存取決於內存如何分配,以及超出實際內存末端時的內存分配情況。

+0

得到了問題。謝謝。 – Dipto

+1

如果您遇到問題,請接受答案 – Chinna