2017-02-17 6 views
0

行列演算用のCコードを記述しました。行と列の値はユーザー定義である必要があります。コードを実行しようとすると、「matrix_addition.exe has stopped working」というポップアップが表示されます。それはなぜそうですか?コードを構築している間、エラーはありません。は、コードブロックで行列演算Cプログラムを実行できません。

#include <stdio.h> 
int main() 
{ 
    int r,c,i,j,a_matrix[r][c],b_matrix[r][c]; 
    printf("Enter the number of rows and columns of matrix\n"); 
    scanf("%d %d", &r, &c); 

    printf("enter the elements of the first matrix \n"); 
    for(i=0;i<r;i++) 
    { 
     for(j=0;j<c;j++) 
     { 
      printf("a_matrix[%d][%d]:",i,j); 
      scanf("%d",&a_matrix[i][j]); //array input 
     } 
    } 

    printf("\n enter the elements of the second matrix \n"); 
    for(i=0;i<r;i++) 
    { 
     for(j=0;j<c;j++) 
     { 
      printf("b_matrix[%d][%d]:",i,j); 
      scanf("%d",&b_matrix[i][j]); //array input 
     } 
    } 
    return 0; 
} 

エラーポップアップの添付画像を参照してください。 enter image description here

+1

あなたは 'r'と 'C'は、有効な値を割り当てた後、' a_matrix'と 'b_matrix'は魔法の適切なサイズに成長することを期待しましたか?それは一般的にCの仕組みではありません。 – unwind

+0

:1)公理に従う:*行ごとに1つのステートメント、ステートメントごとに1つの変数宣言のみ* 2)変数名は、「content」または「usage」(またはそれ以上)。 – user3629249

+0

変数 'r'と' c'の値は、 'a_matrix [r] [c]'と 'b_matrix [r] [c]' < - これがメインです'scanf()'ファンクションファミリのいずれかを呼び出すときにコード – user3629249

答えて

3

プログラムは可変長配列を使用します。しかし、それは不特定の値を持つ変数でそれらを初期化しました。あなたのプログラムの動作は未定義であり、動作する代わりにクラッシュするのは幸運です。

int r,c,i,j,a_matrix[r][c],b_matrix[r][c]; 
    ^
    unspecified value used to initialize the sizes of a_matrix and b_matrix 

即時ソリューションを使用すると、ユーザーの入力を得た後に、単純マトリックス定義を移動することです:

int r,c,i,j; 
printf("Enter the number of rows and columns of matrix\n"); 
scanf("%d %d", &r, &c); 

int a_matrix[r][c], b_matrix[r][c]; 

VLAのはC99で導入し、その規格に導入されたもう一つの特徴はどこに変数を定義する機能がありました最初のブロックスコープではなく、ブロックスコープ内にあります。実際には、可能な限り、最初の使用時点に近い変数を定義するよう努めなければなりません。 IMOは、関数の初めに一緒に束ねるよりもはるかにコードを読みやすくします。


VLAの使用に一定のリスクがあることを警告していない場合は、私は黙っています。最近のC言語の実装では、実行時に関数変数を含むコールスタックを使用しています。コールスタックのサイズはかなり制限されており、非常に大きなVLAを定義すると、プログラムはスタックをオーバーフローさせてすぐに終了します。

1

あなたは2つの可変長配列を定義するよう未定義の動作を呼び出していますが、まだ入力、これその値がに指定されていないとみなされていない変数でそれらを初期化します。

配列の宣言を、そのサイズを読み込んだ箇所の直後に移動することができます。したがって、この部分を変更:

int r,c,i,j,a_matrix[r][c],b_matrix[r][c]; 
printf("Enter the number of rows and columns of matrix\n"); 
scanf("%d %d", &r, &c); 

へ:

int r,c,i,j; 
printf("Enter the number of rows and columns of matrix\n"); 
scanf("%d %d", &r, &c); 
int a_matrix[r][c], b_matrix[r][c]; 
関連する問題