C语言编写两数均值方差计算函数的数组赋值问题咨询
问题代码错误梳理
- 条件判断写为赋值:
if (i=0)是赋值操作,返回值永远为假,会永远走else分支,应该改为等值判断i == 0 - 循环逻辑错误:for循环没有写闭合大括号,return语句被包含在循环体内,第一次循环执行完就直接返回,不会执行第二次赋值
- 类型不匹配:均值、方差都是浮点数,用int类型数组存储会强制截断小数部分丢失精度;同时main函数中用int类型变量接收函数返回的指针,导致后续数组访问完全非法
- printf格式化符不匹配:
%lf对应double类型参数,原代码传入int类型值会输出乱码
可运行数组实现版本
#include <stdio.h> double* statistics (float x, float y){ double mean, var; // 用double类型数组存储浮点结果,静态数组保证函数退出后地址有效 static double Arr[2]; mean = (x + y) / 2; var = ((x - mean) * (x - mean) + (y - mean) * (y - mean)) / 2; // 无需循环,直接赋值即可 Arr[0] = mean; Arr[1] = var; return Arr; } int main(){ int num1 = 10, num2 = 5; // 用double指针接收返回的数组地址 double *result = statistics(num1, num2); printf("%lf -- %lf", result[0], result[1]); return 0; }
运行输出:7.500000 -- 6.250000
非数组实现方案
这里给出更安全的输出参数传递方案,避免静态数组线程不安全、多次调用覆盖值的问题:
#include <stdio.h> // 用指针参数接收外部传入的地址,直接在对应地址写入结果 void statistics(float x, float y, double *mean, double *var) { *mean = (x + y) / 2; *var = ((x - *mean) * (x - *mean) + (y - *mean) * (y - *mean)) / 2; } int main(){ int num1 = 10, num2 = 5; double mean, var; statistics(num1, num2, &mean, &var); printf("%lf -- %lf", mean, var); return 0; }
如果需要封装为单个返回值,也可以用结构体实现,逻辑更清晰:
#include <stdio.h> // 定义统计结果结构体 typedef struct { double mean; double variance; } StatResult; StatResult statistics(float x, float y) { StatResult res; res.mean = (x + y) / 2; res.variance = ((x - res.mean) * (x - res.mean) + (y - res.mean) * (y - res.mean)) / 2; return res; } int main(){ int num1 = 10, num2 = 5; StatResult res = statistics(num1, num2); printf("%lf -- %lf", res.mean, res.variance); return 0; }
内容的提问来源于stack exchange,提问作者guiromero
相关产品推荐
相关产品推荐

