【问题标题】:what's the cause of this difference when encapsulating printf and vfprintf with another function?用另一个函数封装 printf 和 vfprintf 时造成这种差异的原因是什么?
【发布时间】:2014-01-04 14:02:10
【问题描述】:

在这个例子中,这段代码虽然编译它并没有产生正确的结果:

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

  • 所有输出都正常。

这是怎么回事?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2011-04-12
      • 2017-06-22
      相关资源
      最近更新 更多