带有变量参数运行时错误的函数

时间:2012-05-03 16:43:25

标签: c++ c

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

#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 个答案:

答案 0 :(得分:4)

该函数循环直到看到-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);

答案 1 :(得分:2)

您忘记使用-1结束调用,因此您的while循环会导致未定义的行为,因为它会尝试继续获取比您传递的参数更多的参数。它应该是:

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

此外,float参数在传递给可变参数函数时会被提升为double,因此您无法将floatva_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);

答案 2 :(得分:2)

你不想传递-1作为停止while循环的最后一个arg吗?

另外,我相信在使用VAs时浮点数会转换为双精度数,所以将浮点数改为double会很好......

答案 3 :(得分:2)

问题是你的while循环没有终止。您正在检查-1,但从未通过-1。您需要将average功能称为

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

这个示例的运行时示例位于va_arg, va_end, va_start,几乎可以显示您的代码,但使用int代替float作为值。