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

C语言运行同一段代码计算均值结果时对时错的Bug排查

问题原因

你遇到的随机值问题根源是未初始化的局部变量触发了未定义行为:

  • mean函数中声明累加变量float tmp_m;时没有设置初始值,C语言不会自动给栈上的局部变量赋0,第一次循环执行加法时,tmp_m读取的是栈内存里残留的随机垃圾值。每次程序运行时栈的初始状态不同,当残留值恰好为0时计算结果正确,否则就会输出异常值,表现就是结果随机不可控。
  • 额外说明:你当前的median函数逻辑也存在错误,计算中位数要求先对数组排序后再取中间位置值,当前代码直接读取原数组的偏移位置,计算结果不符合中位数定义;同时函数没有覆盖n为0的边界场景,分支外没有返回值也会触发未定义行为。
修复方案
  • 给mean函数里的累加变量tmp_m显式初始化为0.0f,这是解决随机值问题的核心修改。
  • 补全median函数的排序逻辑,复制原数组后排序避免修改输入的原数组,补全边界返回逻辑。

修复后的可运行代码:

#include <stdio.h>
#include <stdlib.h>

// qsort排序用的比较函数
int cmp_int(const void *a, const void *b) {
    return *(const int*)a - *(const int*)b;
}

float mean(int *numbers, int n) {
    int i = 0;
    float tmp_m = 0.0f; // 初始化累加器为0
    for (i = 0; i < n; i++) {
        tmp_m += (float)numbers[i];
    }
    return tmp_m / (float)n;
}

float median(int *numbers, int n) {
    if (n <= 0) return 0.0f; // 处理非法入参
    // 复制原数组,避免排序修改外部传入的原数组
    int *tmp = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        tmp[i] = numbers[i];
    }
    qsort(tmp, n, sizeof(int), cmp_int);

    float res;
    if (n % 2 == 1) {
        res = (float)tmp[n / 2];
    } else {
        res = ((float)tmp[n/2] + (float)tmp[n/2 - 1]) / 2.0f;
    }
    free(tmp);
    return res;
}

int main () {
    int array[6] = {0,2,3,4,0,5};
    int n = 6;
    
    float result_mean = mean(array, n);
    float result_median = median(array, n);

    printf("%f\n%f\n", result_mean, result_median);
    return 0;
}

运行上述代码会稳定输出正确结果:均值为2.333333,中位数为2.500000。

补充说明

C语言中所有栈上的局部变量(非static、非全局作用域)都不会被自动初始化,读取未初始化的变量属于标准规定的未定义行为,除了随机输出错误值,还有概率导致程序崩溃,所有局部变量在第一次读取前必须显式赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:48:13