C中相同的代码导致不同的输出

时间:2018-12-02 01:12:34

标签: c

我有一个给定矩阵的代码,它采用一行中的最小值,并从同一行中的所有值中减去该值。示例:

1 4 5

5 7 6

5 8 8

结果

0 3 4

0 2 1

0 3 3

代码的逻辑在Java中有效,但在C上无效。在C中,代码在netbeans和联机编译器中给出不同的结果。另一个在线编译器出现错误:“ *检测到堆栈粉碎* :已终止 “

int Matrix() {

int a[2][2];
int i, j, lin, col, min;

a[0][0] = 1;
a[0][1] = 4;
a[0][2] = 5;
a[1][0] = 5;
a[1][1] = 7;
a[1][2] = 6;
a[2][0] = 5;
a[2][1] = 8;
a[2][2] = 8;

for (lin = 0; lin < 3; lin++) {

    min = 10000;
    for (col = 0; col < 3; col++) {
        if (a[lin][col] < min)
            min = a[lin][col];
    }
    for (col = 0; col < 3; col++) {
        a[lin][col] = a[lin][col] - min;
      }
    }   
  }

int main() {
   Matrix();
}

1 个答案:

答案 0 :(得分:4)

如果使用不同的编译器得到不同的结果,则几乎100%证明您的代码具有未定义的行为。 (阅读它,以了解为什么这是最糟糕的噩梦。)启用编译器警告是查找未定义行为来源的好方法。

编译后会产生大量警告。

$ compile mat.c 
++ clang -Wall -Wextra -std=c11 -pedantic-errors mat.c
mat.c:4:5: warning: unused variable 'i' [-Wunused-variable]
int i, j, lin, col, min;
    ^
mat.c:4:8: warning: unused variable 'j' [-Wunused-variable]
int i, j, lin, col, min;
       ^
mat.c:8:1: warning: array index 2 is past the end of the array (which contains 2
      elements) [-Warray-bounds]
a[0][2] = 5;
^    ~
mat.c:3:1: note: array 'a' declared here
int a[2][2];
^
mat.c:11:1: warning: array index 2 is past the end of the array (which contains
      2 elements) [-Warray-bounds]
a[1][2] = 6;
^    ~
mat.c:3:1: note: array 'a' declared here
int a[2][2];
^
mat.c:14:1: warning: array index 2 is past the end of the array (which contains
      2 elements) [-Warray-bounds]
a[2][2] = 8;
^    ~
mat.c:3:1: note: array 'a' declared here
int a[2][2];
^
mat.c:27:3: warning: control reaches end of non-void function [-Wreturn-type]
  }
  ^
6 warnings generated.

int a[2][2];更改为int a[3][3];,然后解决其他警告。

还有一件事:

如果值大于10000,请将min = 10000更改为min=a[lin][0]