在采访中,我被问到以下代码片段的输出:
printf("%d", "computer");
我是一名c#开发人员,早些时候我也学过C语言,但当问到这个问题时,我一点都不知道。 当我在Windows 10计算机(64位)中运行相同的问题时,它将putput作为
3571712
请说明发生这种情况的原因。
答案 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而不是字符串。