当格式说明符不正确时,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?"
在一次采访中,我被问及以下代码片段的输出:
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?"