2017-12-01 10 views
-1

2次元配列でいくつかのチェックをしようとしています。これは、あるべき値の小さい方や大きな金額です 場合、エンドユーザーで、プリントから行列の値を取得します行列を確認する

  • : 問題は、私はどのように知っていないということです。
  • マトリックスを印刷します。
  • 宣言された関数の外で配列を編集します。
  • すべての値が異なるかどうかをチェックします。

私は今まで何をしたか、この:

int main() { 
    int m[4][4] = { 
     { 1, 2, 3, 4 }, 
     { 1, 2, 3, 4 }, 
     { 1, 2, 3, 4 }, 
     { 1, 2, 3, 4 } }; 
    to_string((int **) m, 4); 
    return 0; 
} 

/*prints the matrix*/ 
void to_string(int **p, int size) { 
    int i, j = 0; 
    for (; i < size; i++) { 
    j = 0; 
    for (; j < size; j++) { 
     printf("%d\t", p[i][j]); 
    } 
    printf("\n"); 
    } 
} 

が、私はエラーを取得:

Segmentation fault (core dumped) 

結果は次のようになります。

Please enter the size of the matrix: 
"3" 
Enter 9 values: 
"1,2,3,4,5,6,7,8,9" 

1 2 3 
4 5 6 
7 8 9 

すべて値は異なります!

+0

あなたが行列とそのメンバーのサイズを入力するように作業するコードはありますか?もしそうなら、それはその質問に示されていません。 – yano

+0

キャスト '(int **)'を削除し、すべての警告を有効にしてもう一度コンパイルして別の問題を表示します。 – chux

+0

'void to_string(int size、int p [] [size]){'と 'to_string(4、m); 'を使用してください – chux

答えて

0

iを初期化していないため、初期化されていない変数を使用すると未定義の動作が発生するため、segfaultが発生します。 for(i=0;i<size; i++){

にループを変更私の推測では、iは、いくつかの大きな負の値(sizeよりも小さい)に「初期化」されているので、ループに入り、すぐにpの境界をオーバーフローしています。 iが何らかの大きな正の値に初期化されてしまった場合、ループはまったく実行されず、セグメンテーションは期待できませんでしたが、印刷することはできません。これは、動作がと定義されていないため、と定義されています。

私の意見では、可能であればループ内でループ条件変数を初期化することをお勧めします。その値が何であるかを知るために前のコードで狩りをするよりも、初期値を見るほうがずっと簡単です。

/*prints the matrix*/ 
void to_string(int **p, int size){ 
    int i, j; 
    for(i=0; i<size; i++){ 
     for(j=0; j<size; j++){ 
      printf("%d\t", p[i][j]); 
     } 
     printf("\n"); 
    } 
} 
+0

私はお試しいただきありがとうございます! –

+0

私はエラーが発生します: 'for'ループ初期宣言はC99モードでのみ許可されています。私はそれが "ansi"という旗を打っていると思うが、これは私の必要条件である。 –

+0

@ToharPingley代わりにfor(int i = 0; i yano