具有变量参数的函数运行时错误
Function with variable arguments runtime error
我写了这个函数来计算一些浮点数的平均值。但是它在"平均"函数的最后一行有一个运行时错误。它有什么问题?
#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
,因此您不能将float
与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);
难道你不想传递 -1 作为最后一个参数来停止 while 循环吗?
另外,我相信使用 VA 时浮点数会转换为双精度,因此将浮点数更改为双精度会很好......
问题是你的 while 循环没有终止。您正在检查-1
但永远不会通过-1
。您需要将average
函数调用为
float avg = average(12.0f ,34.0f, -1);
在va_arg、va_end va_start有一个此示例的运行时示例,它几乎完全显示了您的代码,但对值使用 int
而不是 float
。
相关文章:
- 在循环中使用lower_bound函数会给出运行时错误
- 为什么在C 类构造函数的正确编译后发生运行时错误
- 为什么此函数中的运行时错误 C++ 深度优先搜索
- C 复制构造函数产生运行时错误
- 为什么当 std::sort 中的比较函数始终返回 true 时出现运行时错误
- 使用虚拟void函数的类中出现运行时错误,但没有编译错误
- 尝试将动态数组分配作为函数时出现运行时错误
- 为什么在为数组输入并输入合并排序函数后出现运行时错误
- 参数的可变数量函数运行时错误
- 具有变量参数的函数运行时错误
- 调用静态成员函数会导致运行时错误
- 在纯虚拟类的析构函数中等待线程死亡会导致运行时错误
- 打印字符串时出现运行时错误,即使它在函数中运行良好
- C++析构函数运行时错误:无法munmap
- 函数从字符串转换为int时出现运行时错误
- 成员函数指针运行时错误——ESP的值在函数调用中没有正确保存
- 我需要写一个函数,将十六进制转换为十进制,并使用递归,我不断得到运行时错误
- GetOpenFileName和系统函数调用运行时错误c++ win32 api
- 使用引用函数调用时出现运行时错误
- C++回调函数运行时错误