c格式字符串:包含格式说明符的printf参数

时间:2017-03-14 10:57:39

标签: c printf format-specifiers

#include <stdio.h>

int main(void) {
    int b= 37;
    char a=10, str[32] = "deva%x %x", buf[32];
    snprintf(buf, sizeof(buf), str);
    printf("%s", buf);
    printf("\n %p", &b);
    return 0;
}

输出继电器: deva80482b9 40020930 0xbfb80aac

想知道printf如何在这里工作&amp;什么是它的印刷价值。它有什么意义吗?

3 个答案:

答案 0 :(得分:2)

这是未定义的行为,因为传递给snprintf()的参数与格式字符串不匹配。

没有进一步分析一般发生的事情是非常有趣的,因为发生的事情是 undefined ,并且可能会从程序的一个编译变为另一个。

最可能的解释是,printf()就像那里的参数一样,从foo-know-where读取数据。

答案 1 :(得分:0)

在你的陈述中

 snprintf(buf, sizeof(buf), str);

格式字符串包含转换说明符(%x),但缺少相应的参数。因此,这会调用undefined behavior

引用C11,章节§7.21.6.1/ p2,

  

[....]如果格式的参数不足,则行为是   未定义。 [...]

你需要写

snprintf(buf, sizeof(buf), str, <list of arguments matching the conversion specifier>);

查看man page了解详情。

答案 2 :(得分:0)

未定义的行为,因为你传递了wong参数,snprintf()与格式字符串不匹配。