2015-03-31 110 views
1

这是一个简单的程序来查找矩形矩阵的痕迹,但每当我尝试运行代码错误弹出“11.exe已停止工作”。11.exe已停止工作(代码块)

我有Windows 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 2015-03-31 09:16:30

+0

......或者花30秒钟看看你自己的代码。代码像'int x; printf(“%d”,x); scanf(“%d”,&x); //从用户读取5将不打印值5,而是打印垃圾或崩溃和烧伤,因为代码行按您输入的顺序执行... – Lundin 2015-03-31 09:44:42

回答

4

在你的代码

a[n][n] 

调用undefined behaviour。因为你已经使用n的。值未初始化。这当然不是你如何使用VLA

作为参考,从C11标准文档

点16.7.9,第10段,

如果具有自动存储持续时间的对象没有被明确初始化,它的值是不确定的 。

.... [该情况下int nn未明确初始化]

,并从附件J

点2.

,章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)。 C99支持VLA。

原因您的问题已经被@Sourav