将printf和vfprintf封装到另一个函数时,这种差异的原因是什么?

时间:2013-12-17 00:02:43

标签: c++ c gcc printf variadic-functions

在此示例中,此代码虽然编译它但不会产生正确的结果:

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);

  • 所有输出都没问题。

这里发生了什么?

1 个答案:

答案 0 :(得分:8)

printf()不会将va_list作为参数,而是变量参数列表,而vprintf()va_list作为参数而不是变量参数列表。基本上,当您使用

调用printf()
printf(str, argptr);

您调用了未定义的行为:第一个参数承诺您将传递intchar*,但您通过了va_list。传递给printf()的参数类型必须与格式字符串中的规范匹配。