C语言自定义头文件中average函数用sizeof计算数组长度结果错误
问题产生原因
该问题是C语言数组特性和代码不规范共同导致的,具体有两个核心原因:
- 数组传参退化:C语言中数组作为函数形参传入时,会自动隐式转换为指向数组首元素的指针,函数形参里写的
int list[]和int *list完全等价。因此函数内sizeof(list)计算的是指针变量的内存大小,而非整个数组的占用空间,最终算出来的元素总数total是错误值。 - 累加变量未初始化:代码中
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
相关产品推荐
相关产品推荐

