标头函数平均在 C 中给了我错误的结果。如果我调用我在标头中创建的“平均”函数,结果与预期不符
Posted
技术标签:
【中文标题】标头函数平均在 C 中给了我错误的结果。如果我调用我在标头中创建的“平均”函数,结果与预期不符【英文标题】:Header function average gives me wrong result in C. If I call the "average" function which I have created in my header, the result is not as expected 【发布时间】:2022-01-12 16:48:21 【问题描述】:我在 C 中创建了一个头文件并将其命名为 statistic.h。我创建了一个函数来计算平均值(我将函数称为“平均值”)。但是当我使用公式时: sizeof (list)/sizeof (list[0]) ,结果是错误的。
头文件如下:
#ifndef STATISTIC_H_INCLUDED
#define STATISTIC_H_INCLUDED
float average(int list[])
int i;
float sum_elements,mean;
int total =sizeof (list)/sizeof (list[0]);
for (i=0;i<total;i++)
sum_elements=sum_elements+list[i];
mean = sum_elements / total;
return mean;
#endif // STATISTIC_H_INCLUDED
//see main code below where I'm trying to call the function I have previously created in the header.
#include <stdio.h>
#include "statistic.h"
int main()
int list[]=26,12,16,56,112,24;
float mean=average(list); // I'm calling the average function I created in my header
printf("%f",mean);
return 0;
/*The average is 41.00 but I'm getting 19.00 instead . If I don't use
the sizeof function and manually declare the variable total=6 (the
number of element in the list), it gives me the correct result
(41.00).*/
【问题讨论】:
【参考方案1】:average
函数中的 list
参数不是数组,而是指针,因此 sizeof
技巧不起作用。
除非它是 sizeof
或一元 &
运算符的操作数,或用于在声明中初始化字符数组的字符串文字,否则 表达式 类型为“N 元素数组T
" 将被转换或 "decay" 为 "pointer to T
" 类型的表达式,其值将是数组中第一个元素的地址。
当您致电average
:
float mean=average(list);
表达式list
从“int
的6元素数组”类型转换为“指向int
的指针”,表达式的值与&list[0]
相同,那么average
实际上是什么接收的是一个指针值,而不是一个数组。
在函数参数声明的上下文中,T a[N]
和 T a[]
都“调整”为 T *a
- 所有三个都将 a
声明为指向 T
的指针,而不是 T
的数组.
您必须将数组大小作为单独的参数传递:
float average( int *list, size_t list_size )
...
for ( size_t i = 0; i < list_size; i++ )
...
并将其称为
mean = average( list, sizeof list / sizeof list[0] );
您还需要在average
函数中将sum_elements
显式初始化为0
。
【讨论】:
非常感谢。 Uni的“教授”无法回答我的问题。我希望有一天我能够回馈我在这里获得的所有帮助。再次感谢约翰。非常感谢。【参考方案2】:average
中的sizeof (list)/sizeof (list[0]);
不起作用,因为list
在作为参数传递给函数时会衰减为int*
。您需要将列表的大小作为参数发送到函数中。
例子:
#include <stddef.h>
#include <stdio.h>
float average(int list[], size_t total) // send total in as an argument
float sum_elements = 0; // note: initialize sum_elements
for (size_t i = 0; i < total; i++)
sum_elements = sum_elements + list[i];
return sum_elements / total;
int main()
int list[] = 26, 12, 16, 56, 112, 24;
// do the size calculation here, where `list` is defined instead:
float mean = average(list, sizeof list / sizeof *list);
printf("%f", mean);
return 0;
Demo
【讨论】:
非常感谢泰德。我已经为此堆积了好几天。你让它看起来如此简单明了。上帝保佑你。 @FabioGenua 很高兴听到这个消息!不客气! @FabioGenua 如果您觉得答案有帮助,请考虑accepting它。以上是关于标头函数平均在 C 中给了我错误的结果。如果我调用我在标头中创建的“平均”函数,结果与预期不符的主要内容,如果未能解决你的问题,请参考以下文章
尝试更改状态栏样式在 ios 中给了我错误 - React native
当我从线程打印时,它使用 ncurses 在 C 中给了我奇怪的输出