这里的错误是您通过了
va_list
转换为另一个函数并调用
va_arg
在该功能中。一旦您这样做,就不允许使用
va_list
再次在呼叫者中。
这一点在
C standard
关于变量自变量:
声明的类型为
va_list
它是一种适合保存信息的完整对象类型
宏所需
va_start
,
va_arg
,
va_end
和
va_copy
.如果访问
对于所需的可变参数,被调用的函数应声明
具有类型的对象(在本款中通常称为ap)
va_list
。对象
ap
可以作为参数传递给另一个
作用
如果该函数调用
va_arg
带参数的宏
ap
,
的价值
ap
在调用函数中是不确定的,应为
传递给
va_end
在进一步引用之前的宏
ap
.
253)
-
允许创建指向的指针
va_list
并将该指针传递给另一个函数,其中
以防在其他函数返回后,原始函数可以进一步使用原始列表。
所以你的代码触发
undefined behavior
通过访问
args
在其值变得不确定之后。
请注意,上面的脚注253指出,您可以将指针传递到
va_list
做你想做的事:
void print_vint(va_list *args)
{
int i = va_arg(*args, int);
printf("%d\n", i);
}
void variadic_f(const char* format, ...)
{
va_list args;
va_start(args, format);
print_vint(&args);
print_vint(&args);
va_end(args);
}