2015-03-31 3 views
1

Это простая программа для поиска следа квадратной матрицы, но всякий раз, когда я пытаюсь запустить код, появляется всплывающее сообщение «11.exe перестает работать».11.exe перестает работать (Code Blocks)

У меня есть окна 8.1

Я использую GNU GCC компилятор. вот код:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int n,i,j,a[n][n],tr=0; 
    printf("enter order of square matrix\n"); 
    scanf("%d",&n); 
    printf("enter the entries of matrix\n"); 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<n;j++) 
     { 
      printf("a[%d][%d]",i+1,j+1); 
      scanf("%d",&a[i][j]); 
     } 
     tr+=a[i][i]; 
    } 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<n;j++) 

     { 
      printf("%d",a[i][j]); 
     } 
     printf("\n"); 
    } 
    printf("trace of matrix is\t%d",tr); 
    return 0; 
} 
+0

Использование отладчика. Установите точки останова. – DrKoch

+0

... или просто потратьте 30 секунд на свой собственный код. Код типа 'int x; printf ("% d", x); scanf ("% d", &x); // читать 5 из пользователя' не будет печатать значение 5, а скорее печатать мусор или сбой и записывать, потому что строки кода выполняются в том порядке, в котором вы их вводите ... – Lundin

ответ

4

В коде

a[n][n] 

вызывает undefined behaviour. как вы использовали n. значение неинициализировано. Это, конечно, не то, как вы используете VLA.

Для справки, от C11 стандартного документа

Пункт 1. Глава 6.7.9, пункт 10,

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

.... [Дело для int n, n не инициализирована явно]

и

Точка 2.

из приложения J, глава J.2, причины неопределенного поведения,

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

.... [Случай a[n][n],]

Решение:

Вы должны переместить определение a после того как вы успешно сканируется Значение n.

1
int n,i,j,a[n][n],tr=0; 
printf("enter order of square matrix\n"); 
scanf("%d",&n); 

должно быть

int n,i,j,tr=0; 
printf("enter order of square matrix\n"); 
scanf("%d",&n); 
int a[n][n]; 

Теперь a является переменной массива длины (VLA). VLA поддерживается с C99.

Причина вашей проблемы уже объясняется @Sourav

Смежные вопросы