我有一个给定矩阵的代码,它采用一行中的最小值,并从同一行中的所有值中减去该值。示例:
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();
}
答案 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]
。