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

为何该C程序可计算最小值却无法正确计算最大值?

原代码最大值计算异常的原因分析

问题回顾

你编写的C语言程序用于读取数字列表(输入负数时结束),计算总和、最大值、最小值及平均值。其他功能正常,但最大值计算异常——比如输入3、6、8、9、-1时,最大值输出1075314688这类随机垃圾值。你通过将第42行的max=addend[i]改为max=addend[divider-1]解决了问题,以下是原代码出错的核心原因:

核心原因:数组越界访问+变量i的状态错误

我们以输入3、6、8、9、-1为例,跟着代码执行流程梳理:

  1. 输入结束后,divider的值为4(循环到i=4时输入-1并触发break,有效数字是前4个,对应数组索引0-3)。
  2. 进入else分支后,首先执行i=divider-1,此时i的值为3。
  3. 执行最小值计算循环:
    min=addend[i]; // min初始为addend[3]=9
    while (i>=0) {
        if (addend[i-1]<min) {
            min=addend[i-1];
        }
        i=i-1;
    }
    
    循环会持续执行到i变为-1才退出——每次循环i减1,当i=0时,执行循环体后i变成-1,不再满足i>=0的循环条件。
  4. 此时执行max=addend[i],也就是访问addend[-1]——这是严重的数组越界访问。C语言数组索引从0开始,addend[-1]指向了数组第一个元素之前的内存区域,该区域存储的是未定义的随机垃圾值,这就是你看到异常输出的直接原因。

额外说明

顺带提一句:你代码里的最小值计算循环也存在数组越界问题(当i=0时访问addend[-1]),只是刚好没影响到最终结果而已。后续优化时可以统一调整循环逻辑,比如从索引0开始遍历到divider-1,彻底避免越界风险。

内容的提问来源于stack exchange,提问作者Gaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:12:18