当格式说明符不正确时,printf函数如何在c中工作?

时间:2017-03-14 07:27:20

标签: c printf format-specifiers

在采访中,我被问到以下代码片段的输出:

printf("%d", "computer");

我是一名c#开发人员,早些时候我也学过C语言,但当问到这个问题时,我一点都不知道。 当我在Windows 10计算机(64位)中运行相同的问题时,它将putput作为

  

3571712

请说明发生这种情况的原因。

4 个答案:

答案 0 :(得分:4)

“工作”,您观察到的是 undefined behavior 的结果。

引用C11,章节§7.21.6.1/ p9

  

[...]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

在您的情况下,转换说明符为%d,它需要类型为int的参数,但您提供char*,并且它们不是兼容类型,因此UB

答案 1 :(得分:4)

"computer"的井值是存储该字符串的内存地址。可能是该地址的价值是:3571712(但你不应该依赖于此 - 见下文)。

但要打印内存地址void*,您应该使用%p格式说明符。使用不正确的格式说明符是未定义的行为。

答案 2 :(得分:2)

  

在采访中,我被问到以下代码片段的输出[...]

你的回答可能是:

一个。 “这是未定义的行为”

湾“很可能会打印一个数字,但我无法告诉您哪个数字,因为我不知道字符串的存储位置,因为字符串的地址将被printf函数解释为整数”。

℃。 “哪个平台?哪个编译器?”

答案 3 :(得分:0)

它不会产生这些变量的垃圾值。主要原因是我们使用“%d”输出int而不是字符串。