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

rsk*_*k82 3 c c++ printf gcc variadic-functions

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

void encapsulatePrintf(const char *str, ...) {
  va_list argptr;
  va_start(argptr, str);
  printf(str, argptr);
  va_end(argptr);
}
Run Code Online (Sandbox Code Playgroud)

然后在主要: encapsulatePrintf("test str: %i - %s", 22, "test2");

  • 结果是在内存中某处的随机字节: test str: 2293428 - á "

但是当我将功能从更改printfvfprintf(stdout, str, argptr);

  • 所有输出都没问题.

这里发生了什么 ?

Die*_*ühl 8

printf()不采用va_list参数而是参数的变量列表,而vprintf()采用va_listas参数而不是变量参数列表.基本上,当你打电话printf()使用时

printf(str, argptr);
Run Code Online (Sandbox Code Playgroud)

你调用了未定义的行为:第一个参数承诺你会传递一个int和一个char*但是你传递了一个,而不是一个va_list.传递给的参数类型printf()必须与格式字符串中的规范匹配.