2017-11-20 9 views
0

私はこの小さなコードを持っています。 私はちょっと新しく、私はミスを見つけませんでした。おかげであなたが配分されている何配列へのダブルポインタを出力する - クラッシュを続ける

int main (void) 
{ 
    int **array; 
    int i,j, m; 

    scanf("%d", &m); 

    array = malloc(sizeof(int) * (m*m)); 


    for (i = 0; i < m; i++) 
    { 
     for (j = 0; j < m; j++) 
     {  
      scanf("%d", &array[i][j]);      
     } 
    } 

     for (i = 0; i < m; i++) 
     { 
      for (j = 0; j < m; j++) 
      {  
       printf("%d", array[i][j]);     
      } 
     } 

    return 0; 
} 
+0

これを絞り込むために行ったデバッグは何ですか? – lurker

+0

入力を確認してください!あなたはm * m + 1 scanfを持っていますが、一度は結果や戻り値をチェックしません。 –

答えて

5

はサイズm*mの1次元配列ですが、あなたは各行がm要素が含まれているジャグ配列が割り当てられているかのようにあなたはそれを使用しています。

あなたはまた、あなたがijを使用して直線的にすべての要素を置くことができます

array = malloc(sizeof *array * m); 
if(array == NULL) 
{ 
    // error in malloc 
} 
for(size_t i =0; i<m; i++) 
{ 
    array[i]= malloc(sizeof *array[i] * m); 
    if(array[i] == NULL) 
    { 
     // error 

    } 
} 
... 
for(size_t i = 0; i<m ; i++) 
    free(array[i]); 
free(array); 

なかったものとは少し違った方法を割り当てることができます。

int *array; 
... 
for (i = 0; i < m; i++) 
{ 
    for (j = 0; j < m; j++) 
    {  
     if(scanf("%d", &array[i*m+j]) != 1){ 
      // error in getting input. 
     }      
    } 
} 
... 
free(array); 

同義語はprintfと同じです。

freeあなたが作業を完了した後で動的に割り当てたメモリも忘れないでください。

関連する問題