C语言二维数组成绩累加计算结果异常问题求解
问题根本原因
出现超大随机值的核心原因是栈上局部数组未初始化,累加操作是在内存残留垃圾值的基础上执行的:
- C语言中函数内部定义的非静态局部数组
arr[5][5]分配在栈内存上,定义时不会自动清零,所有元素初始值都是对应内存位置之前残留的无意义随机数。 - 你的所有总分计算逻辑都用了
+=累加运算符,本质是取「元素当前值 + 新值」再存回元素,从来没给存总分的位置赋过初始值0,计算结果自然会带上初始的随机垃圾值。 - 输出里前两个学生总分刚好是10、第三个是11纯粹是概率事件——对应内存位置残留值刚好是0、1,第四个学生总分位置残留了一个大整数,最后一行科目总分位置也残留了随机值,就出现了和预期偏差极大的异常数值。
修复方案
最简便、不容易漏写的修复方式是定义数组时直接将所有元素初始化为0,C语言规定初始化列表只要显式给第一个元素赋值,剩余未显式指定的元素会自动填充为0:
// 把原代码里的数组定义替换为这行即可 int arr[5][5] = {0};
修改后所有元素初始值都是0,后续+=累加就是从0开始计数,计算结果完全符合预期。
如果你不想初始化整个数组,也可以在每一段累加逻辑前单独给对应总分位置赋0:
- 计算个人总分前,循环给每个学生的总分位
arr[i][4] = 0 - 计算科目总分前,循环给每个科目的总分位
arr[4][i] = 0 - 计算全员全科总合计前,给右下角总合计位
arr[4][4] = 0
这种写法需要注意不要漏写赋值位置,不如直接初始化全数组稳妥。
额外提示:你代码里的科目打印文案和最开始描述的索引对应规则有出入(代码里case0对应韩语、case2对应数学,和你最开始说的
arr[0][0]是数学的规则不一致),如果需要严格匹配索引规则可以自行调整switch分支的打印文案,这个问题不会导致随机大数,仅会影响科目对应关系。
内容的提问来源于stack exchange,提问作者chobodark
相关产品推荐
相关产品推荐

