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; }
错误原因分析
未传入数组长度参数
函数median的参数列表中没有包含数组元素数量count,代码中直接使用的count要么是未定义的(编译阶段报错),要么是全局变量但值不符合预期。比如当全局count取值错误时,会导致访问数组越界,读取到内存中的0值。数组索引计算错误
C语言数组采用0起始索引,但原代码的索引逻辑基于1起始位置:- 奇数长度时,比如数组长度为1,
(count+1)/2得到1,访问array[1]属于越界操作,读取到的是数组外的未知内存值(恰好为0); - 偶数长度时,索引计算同样偏移,导致访问错误的数组元素。
- 奇数长度时,比如数组长度为1,
整数除法精度丢失
计算平均值时,两个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
相关产品推荐
相关产品推荐

