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
相关产品推荐
相关产品推荐

