考虑这个功能
double avg(double v1,double v2,...)
{
double sum=v1+v2;
int counter=2;
double temp;
va_list pargs;
va_start(pargs,v2);
while((temp=va_arg(pargs,double))!=0.0)
{
sum+=temp;
counter++;
}
va_end(pargs);
return sum/counter;
}
Run Code Online (Sandbox Code Playgroud)
此调用printf("%lf\n",avg(3.0,4.5,4.5,3.0,0.0))返回正确的结果,但如果我删除0.0它打印的最后一个参数-321738127312000000000.0000000,但sum和counter具有正确的值.我有点不明白为什么我要检查!=0.0并拥有最后一个参数0.0
因为没有任何其他外部信息,函数不知道传递了多少个参数.有几种策略可以解决这个问题:包括一个显式参数,即额外参数的数量,使用格式字符串来定义参数(例如作为与printf和scanf家族的功能),或者使用一个标记值如0申报的参数的结尾.
在你的情况下,如果你省略了哨兵,那么这个函数就会一直向下走,直到它达到零值,并且根据堆栈中的数据,你可能得到截然不同的结果,都是不正确的.