C语言矩阵加法结果中为何出现间隔零值?
矩阵加法异常问题的解决方案
问题根源
你的代码核心问题是矩阵加法函数的参数类型不匹配,导致内存访问错误:
addMatrices函数的第三个参数声明为int *result[3][3],这是一个3×3的指针数组,而非我们需要的二维整数数组。- 主函数中传入
&result(二维数组的地址,类型为int (*)[3][3]),与函数期望的参数类型不兼容,赋值时会错误地操作内存,最终导致结果矩阵出现交替的0和正确值。
修正方案
1. 修改addMatrices函数的参数类型
将第三个参数改为二维整数数组类型,C语言中二维数组作为函数参数时会退化为指向一维数组的指针,直接使用int result[3][3]即可:
void addMatrices(int m1[3][3], int m2[3][3], int result[3][3]) { int row; int col; for (row=0; row < 3; row++) { for (col=0; col<3;col++) { result[row][col] = m1[row][col] + m2[row][col]; } } }
2. 修正主函数的调用方式
直接传递result数组名即可(数组名会隐式转换为指向首元素的指针),不需要取地址:
int result[3][3]; int sampleM1[3][3] = {{1,1,1}, {1,1,1}, {1,1,1}}; int sampleM2[3][3] = {{1,1,1}, {1,1,1}, {1,1,1}}; addMatrices(sampleM1, sampleM2, result); printMatrix(0, result);
3. 验证结果
修正后运行代码,两个全1的3×3矩阵相加会得到全2的矩阵,符合预期:
matriks 0: 2 2 2 2 2 2 2 2 2
补充说明
如果一定要使用指针形式传递二维数组,也可以将addMatrices的第三个参数声明为int (*result)[3][3],此时函数内的赋值需要解引用指针:
void addMatrices(int m1[3][3], int m2[3][3], int (*result)[3][3]) { int row; int col; for (row=0; row < 3; row++) { for (col=0; col<3;col++) { (*result)[row][col] = m1[row][col] + m2[row][col]; } } }
对应的主函数调用保持addMatrices(sampleM1,sampleM2,&result);即可,但这种写法不如直接传递数组直观,推荐使用第一种修正方案。
内容的提问来源于stack exchange,提问作者k12293139
相关产品推荐
相关产品推荐

