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

C语言自定义头文件中average函数用sizeof计算数组长度结果错误

问题产生原因

该问题是C语言数组特性和代码不规范共同导致的,具体有两个核心原因:

  1. 数组传参退化:C语言中数组作为函数形参传入时,会自动隐式转换为指向数组首元素的指针,函数形参里写的int list[]和int *list完全等价。因此函数内sizeof(list)计算的是指针变量的内存大小,而非整个数组的占用空间,最终算出来的元素总数total是错误值。
  2. 累加变量未初始化:代码中sum_elements定义时没有赋初始值,会携带内存中的随机垃圾值,累加后结果自然不符合预期。手动设置total=6时得到正确结果属于巧合,仅为当前运行环境下该变量的初始垃圾值刚好为0,换环境大概率仍会出错。
解决方法

最通用、兼容性最高的方案是新增数组长度作为函数入参,在数组定义的同级作用域计算好长度后传入函数,同时修复变量未初始化的问题:

修改后的statistic.h代码

#ifndef STATISTIC_H_INCLUDED
#define STATISTIC_H_INCLUDED

float average(int list[], int total){
    int i;
    // 初始化累加变量为0
    float sum_elements = 0.0f, mean;
    for (i = 0; i < total; i++){
        sum_elements += list[i];
    }
    mean = sum_elements / total;
    return mean;
}

#endif // STATISTIC_H_INCLUDED

修改后的main函数代码

#include <stdio.h>
#include "statistic.h"
int main(){
    int list[] = {26,12,16,56,112,24};
    // 在数组定义的同级作用域计算长度,此时list未退化为指针,计算结果正确
    int total = sizeof(list) / sizeof(list[0]);
    float mean = average(list, total);
    printf("%f", mean);
    return 0;
}

注意事项

sizeof(数组名)/sizeof(数组元素)的计算方式仅能在数组定义的同一作用域下使用,数组作为参数传入其他函数后,就无法再通过该方法获取数组长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:03