在此示例中,此代码虽然编译它但不会产生正确的结果:
void encapsulatePrintf(const char *str, ...) {
va_list argptr;
va_start(argptr, str);
printf(str, argptr);
va_end(argptr);
}
然后在主要:encapsulatePrintf("test str: %i - %s", 22, "test2");
test str: 2293428 - á "
但是当我将功能从printf
更改为vfprintf(stdout, str, argptr);
这里发生了什么?
答案 0 :(得分:8)
printf()
不会将va_list
作为参数,而是变量参数列表,而vprintf()
将va_list
作为参数而不是变量参数列表。基本上,当您使用
printf()
时
printf(str, argptr);
您调用了未定义的行为:第一个参数承诺您将传递int
和char*
,但您通过了va_list
。传递给printf()
的参数类型必须与格式字符串中的规范匹配。