#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;什么是它的印刷价值。它有什么意义吗?
答案 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()与格式字符串不匹配。