3×3矩阵求和程序中数组值意外篡改问题排查
矩阵求和时数值意外篡改的问题解决
嘿,我仔细看了你的代码,一下子就找到问题的根源了——这是数组越界访问引发的未定义行为!
问题分析
你代码里定义的三个矩阵:
int matrix1[2][2]; int matrix2[2][2]; int sumMatrix[2][2];
都是2×2的数组,对应的合法索引范围是i从0到1,j从0到1。但你所有的循环逻辑都是:
for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ // ... 读写数组元素 } }
这意味着你要访问3×3的元素,完全超出了数组的边界。C语言不会自动检查数组越界,当你访问matrix1[2][0]这类超出范围的元素时,会直接读写相邻的内存区域——这就会导致其他变量(比如另一个矩阵的元素)被意外篡改。而且因为程序运行时的内存布局不是固定的,这种问题不会每次都出现,这正是未定义行为的典型表现。
修正后的代码
只需要把数组的定义改成3×3的,和你的循环逻辑匹配就行:
#include<stdio.h> int main(){ // 注意:main函数标准返回类型是int,不是void int matrix1[3][3]; int matrix2[3][3]; int sumMatrix[3][3]; for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ printf("Matrix[%d][%d]\n", i, j); printf("Enter matrix one's values> "); scanf("%d", &matrix1[i][j]); } printf("\n"); } for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ printf("Matrix[%d][%d]\n", i, j); printf("Enter matrix two's values> "); scanf("%d", &matrix2[i][j]); } printf("\n"); } for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ sumMatrix[i][j] = matrix1[i][j] + matrix2[i][j]; } } // 打印三个矩阵 for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ printf("%d ", matrix1[i][j]); } printf("\n"); } printf("\n"); for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ printf("%d ", matrix2[i][j]); } printf("\n"); } printf("\n"); for(int i = 0; i<3; i++){ for(int j = 0; j<3; j++){ printf("%d ", sumMatrix[i][j]); } printf("\n"); } return 0; // 标准main函数需要返回值 }
另外我还顺手修正了两个小细节:
- 把
void main()改成了标准的int main(),并添加了return 0;,这是C语言的规范写法。 - 保持了你的循环逻辑不变,因为你本来就是要处理3×3的矩阵。
这样修改后,数组的大小和循环的范围匹配,就不会再出现越界访问的问题,矩阵的数值也不会被意外篡改了。
内容的提问来源于stack exchange,提问作者Sen ZmaKi
相关产品推荐
相关产品推荐

