C语言传递二维数组至函数:矩阵对角线和差值计算异常问题
问题分析与修复方案
你的代码逻辑在计算两条对角线和的差值上是正确的,但有两个关键点可能导致你觉得它“仅对部分数值有效”:
1. Main函数返回值的显示问题
C语言中main函数的返回值会被操作系统当作程序的退出状态码,而大多数系统会将其视为无符号8位整数(范围0-255)。如果差值是负数,比如测试用例中的-3,系统会自动将其转换为253(-3 + 256 = 253),这会让你误以为计算结果错误。
2. 可能的需求误解:是否需要返回绝对值?
如果你的需求是返回两条对角线和的绝对值差值(比如|主对角线和 - 副对角线和|),当前代码返回的带符号结果就会不符合预期。
修复后的代码
我们可以调整代码逻辑,让结果显示更直观,同时提升代码可读性:
#include <stdio.h> #include <stdlib.h> #include <math.h> // 用于abs函数 #define N 2 // 计算两条对角线和的差值(主对角线和 - 副对角线和) int SommaDIag(int mat[N][N]) { // 用二维数组形参更清晰,避免指针计算混淆 int somma = 0; // 遍历主对角线:mat[rig][rig] for(int rig = 0; rig < N; rig++) somma += mat[rig][rig]; // 遍历副对角线:mat[rig][N-1 - rig](右上到左下的常规逻辑) for(int rig = 0; rig < N; rig++) somma -= mat[rig][N-1 - rig]; return somma; } int main(){ int mat[N][N] = {{3, 2}, {6, 2}}; int diff = SommaDIag(mat); // 直接打印结果,避免依赖main返回值的系统转换问题 printf("两条对角线和的差值:%d\n", diff); // 如果需要绝对值差值,取消下面注释: // printf("两条对角线和的绝对值差值:%d\n", abs(diff)); return 0; // main正常返回0,表示程序执行完成 }
关键改进点
- 用
int mat[N][N]作为函数形参,比int *mat更直观,可读性更强,也减少了指针计算出错的概率。 - 副对角线的访问改为
mat[rig][N-1 - rig],符合常规的副对角线遍历逻辑(从右上到左下)。 - 在
main中直接打印结果,避开了操作系统对退出码的转换问题,结果展示更准确。 - 若需要绝对值差值,可使用
abs()函数(需包含<math.h>头文件)。
测试验证
对于你的测试用例{{3,2},{6,2}}:
- 主对角线和:
3 + 2 = 5 - 副对角线和:
2 + 6 = 8 - 差值:
5 - 8 = -3,修复后的代码会直接打印-3;如果启用绝对值逻辑则打印3,完全符合预期。
对于奇数阶矩阵(比如N=3):
int mat[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
- 主对角线和:
1+5+9=15 - 副对角线和:
3+5+7=15 - 差值:
0,代码返回正确结果,中间元素5被加一次减一次,抵消后不影响最终结果。
内容的提问来源于stack exchange,提问作者Antonio Pavan
相关产品推荐
相关产品推荐

