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

How the printf function works in c when format specifier is not correct?

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

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

我是一个c#开发者,之前也学过C,但是问这个问题的时候,一头雾水。 当我 运行 在 windows 10 台计算机(64 位)中提出同样的问题时,它给出了 putput as

3571712

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

它不是"work",你观察到的是undefined behavior的结果。

引用 C11,章节 §7.21.6.1/p9

[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

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

给这些变量的垃圾值是行不通的。主要原因是我们使用“%d”作为 int 的输出而不是 string。

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

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

In an Interview, I was asked the output of the following code snippet [...]

你的答案可能是:

一个。 "This is undefined behavior"

b。 "A number will most likely be printed, but I cannot tell you which number because I do not know where the string is stored, as the string's address will be attempted to be interpreted as an integer by the printf function".

c。 "Which platform? Which compiler?"