我想将变量参数传递给函数但不想在参数中设置数字。所以我用0检查参数的结尾如下:
#include <stdarg.h>
#include <stdio.h>
void foo(char* str, ... )
{
printf("str: %s\n",str);
va_list arguments;
va_start(arguments,str);
while(1) {
double data = va_arg(arguments,double);
if (data == 0) {
break;
}
printf("data: %.2f\n",data);
}
va_end (arguments);
return;
}
int main()
{
foo("hello", 5.5, 4.5, 3.5);
}
但看起来似乎不正确:
str: hello
data: 5.50
data: 4.50
data: 3.50
data: 34498135662005122837381407988349324615424289861359674446209831441373336786008345008385190019649501215393603210517859097842586295826918562939434091794406737728862534747430060032.00
最后一个数据输出是随机值,它应该不存在!
答案 0 :(得分:4)
您可以通过向传递的值添加sentinel值来解决此问题。
int main()
{
foo("hello", 5.5, 4.5, 3.5, 0.0);
}
我的测试中必须0.0
,而不是0
。
答案 1 :(得分:3)
当您调用该函数时,您不会提供0.0
参数。该函数尝试将所有内容打印到零参数,但没有这样的参数。
该函数将继续查看内存,它会指望第5个,第6个......参数,直到一个这样的位置随机包含零或程序崩溃。