0

我写了这个函数来计算一些浮点数的平均值。但是它在“平均”函数的最后一行出现运行时错误。它有什么问题?

#include <stdarg.h>
#include <stdio.h>



float average(float first , ...)
{
    int count = 0;
    float sum = 0 , i = first;

    va_list marker;

    va_start(marker , first);
    while(i != -1)
    {
        sum += i;
        count++;
        i = va_arg(marker , float);
    }

    va_end(marker);
    return(sum ? (sum / count) : 0);
}


int main(int argc , char* argv[])
{
    float avg = average(12.0f , 34.0f);

    printf("The average is : %f\n" , avg);
    scanf("a\n");
}
4

4 回答 4

4

函数循环直到它看到 a -1,并且调用者没有提供-1.

我盒子上的手册页承诺“随机错误”:

va_arg()
   ...
   If  there  is  no  next argument, or if type is not compatible with the
   type of the actual next argument (as promoted according to the  default
   argument promotions), random errors will occur.

尝试:

float avg = average(12.0f, 34.0f, -1f);
于 2012-05-03T16:46:15.757 回答
2

您忘记以 a 结束调用-1,因此您的while循环会导致未定义的行为,因为它试图不断获得比您传递的参数更多的参数。它应该是:

float avg = average(12.0f, 34.0f, -1f);

此外,float参数在传递给可变参数函数时会被提升为double,因此您不能使用floatwith va_arg。你应该使用double这一切:

double average(double first, ...)
{
    int count = 0;
    double sum = 0, i = first;

    va_list marker;

    va_start(marker, first);
    while(i != -1)
    {
        sum += i;
        count++;
        i = va_arg(marker, double);
    }

    va_end(marker);

    return sum ? sum / count : 0;
}

double avg = average(12.0, 34.0, -1.0);
于 2012-05-03T16:45:38.853 回答
2

你不想通过 -1 作为最后一个参数来停止 while 循环吗?

另外,我相信在使用 VA 时浮点数会转换为双精度数,因此将浮点数更改为双精度会很好......

于 2012-05-03T16:49:02.127 回答
2

问题是您的 while 循环没有终止。您正在检查-1但从未传入-1. 您需要将您的average函数称为

float avg = average(12.0f ,34.0f, -1);

在va_arg, va_​​end, va_​​start有这个示例的运行时示例,它几乎完全显示了您的代码,但使用int而不是float值。

于 2012-05-03T16:50:45.933 回答