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

C语言数组中位数计算异常:调用函数后返回值始终为0

C语言中位数函数返回0的问题修复

问题场景

数组已预先排序、数据有效,能正确计算平均值和总和,但调用median函数时返回值始终为0,数组中仅包含一个0元素。原函数代码如下:

//The array is sorted prior to this
//count is the amount of values in the array

double median(int64_t *array)
{
        double q2;
        int64_t pos, pos1;
        if (count % 2 == 0) 
        {
                //even
                pos = count / 2;
                pos1 = (count + 2) / 2;
                q2 = (array[pos] + array[pos1]) / 2;
        }
        else
        {
                //odd
                pos = (count + 1) / 2;
                q2 = array[pos];
        }
        return q2;
}

错误原因分析

  1. 未传入数组长度参数
    函数median的参数列表中没有包含数组元素数量count,代码中直接使用的count要么是未定义的(编译阶段报错),要么是全局变量但值不符合预期。比如当全局count取值错误时,会导致访问数组越界,读取到内存中的0值。

  2. 数组索引计算错误
    C语言数组采用0起始索引,但原代码的索引逻辑基于1起始位置:

    • 奇数长度时,比如数组长度为1,(count+1)/2得到1,访问array[1]属于越界操作,读取到的是数组外的未知内存值(恰好为0);
    • 偶数长度时,索引计算同样偏移,导致访问错误的数组元素。
  3. 整数除法精度丢失
    计算平均值时,两个int64_t类型的元素相加后直接除以整数2,会触发整数除法,结果被截断为整数,再转为double时丢失精度。

修复后的代码

// 数组已预先排序
// count 为数组中的元素数量
double median(int64_t *array, size_t count)
{
    double q2;
    if (count % 2 == 0) 
    {
        // 偶数个元素:取中间两个元素的平均值
        size_t pos_left = count / 2 - 1;
        size_t pos_right = count / 2;
        // 先转换为double避免整数溢出,用2.0确保浮点除法
        q2 = ((double)array[pos_left] + array[pos_right]) / 2.0;
    }
    else
    {
        // 奇数个元素:取中间位置的元素
        size_t pos = count / 2;
        q2 = array[pos];
    }
    return q2;
}

修复说明

  • 新增size_t count作为函数参数,确保使用正确的数组长度,避免依赖全局变量;
  • 修正索引计算逻辑,适配C语言0起始数组的规则;
  • 计算平均值时,先将其中一个元素转为double类型,并用2.0进行除法,保证浮点运算的精度,同时避免整数溢出风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:20:12