为何该C程序可计算最小值却无法正确计算最大值?
原代码最大值计算异常的原因分析
问题回顾
你编写的C语言程序用于读取数字列表(输入负数时结束),计算总和、最大值、最小值及平均值。其他功能正常,但最大值计算异常——比如输入3、6、8、9、-1时,最大值输出1075314688这类随机垃圾值。你通过将第42行的max=addend[i]改为max=addend[divider-1]解决了问题,以下是原代码出错的核心原因:
核心原因:数组越界访问+变量i的状态错误
我们以输入3、6、8、9、-1为例,跟着代码执行流程梳理:
- 输入结束后,
divider的值为4(循环到i=4时输入-1并触发break,有效数字是前4个,对应数组索引0-3)。 - 进入else分支后,首先执行
i=divider-1,此时i的值为3。 - 执行最小值计算循环:
循环会持续执行到i变为-1才退出——每次循环i减1,当i=0时,执行循环体后i变成-1,不再满足min=addend[i]; // min初始为addend[3]=9 while (i>=0) { if (addend[i-1]<min) { min=addend[i-1]; } i=i-1; }i>=0的循环条件。 - 此时执行
max=addend[i],也就是访问addend[-1]——这是严重的数组越界访问。C语言数组索引从0开始,addend[-1]指向了数组第一个元素之前的内存区域,该区域存储的是未定义的随机垃圾值,这就是你看到异常输出的直接原因。
额外说明
顺带提一句:你代码里的最小值计算循环也存在数组越界问题(当i=0时访问addend[-1]),只是刚好没影响到最终结果而已。后续优化时可以统一调整循环逻辑,比如从索引0开始遍历到divider-1,彻底避免越界风险。
内容的提问来源于stack exchange,提问作者Gaya
相关产品推荐
相关产品推荐

