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

Function with variable arguments runtime error

本文关键字:函数 运行时错误 参数 变量      更新时间:2023-10-16

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

#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 : %fn" , avg);
    scanf("an");
}

该函数循环直到它看到-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结束调用,所以你的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);

难道你不想传递 -1 作为最后一个参数来停止 while 循环吗?

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

问题是你的 while 循环没有终止。您正在检查-1但永远不会通过-1。您需要将average函数调用为

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

在va_arg、va_end va_start有一个此示例的运行时示例,它几乎完全显示了您的代码,但对值使用 int 而不是 float