2017-02-17 26 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

Ожидали ли вы '' a_matrix' и b_matrix' волшебно вырасти до нужного размера раз '' r' и c' были назначены допустимые значения? Это не так, как C работает, в общем. – unwind

+0

для удобства чтения и понимания: 1) следовать аксиоме: * только один оператор на строку и (самое большее) одно объявление переменной для каждого оператора. * 2) имена переменных должны указывать на «контент» или «использование» (или лучше, оба). – user3629249

+0

значения переменных 'r' и' c' должны быть назначены перед их использованием для объявления массивов: 'a_matrix [r] [c]' и 'b_matrix [r] [c]' <- это основная проблема с кодом – 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

вы вызываете неопределенное поведение, как можно определить два массива переменной длины, но инициализировать их с переменными вы еще не приняли в качестве входных, таким образом их значения не указаны.

Вы можете перемещать объявление своих массивов точно после точки, где вы читаете их размер. Поэтому изменить эту часть:

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];