You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:33:19