【问题标题】:How the printf function works in c when format specifier is not correct? [duplicate]当格式说明符不正确时,printf 函数如何在 c 中工作? [复制]
【发布时间】:2017-08-04 10:30:27
【问题描述】:

在一次采访中,我被问到以下代码 sn-p 的输出:

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

我是一名 c# 开发人员,之前我也学过 C,但是当被问到这个问题时,我毫无头绪。 当我在 Windows 10 计算机(64 位)上运行相同的问题时,它给出 putput as

3571712

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

【问题讨论】:

  • 另见:this questionthis question
  • 要么这是一个故意的棘手问题,看看你是否知道代码没有意义,要么这是一个无意的完全废话问题,在这种情况下,你无论如何都不想要这份工作。正确答案是 not “它将打印字符串文字的地址”,因为它为此使用了错误的格式说明符。

标签: c printf format-specifiers


【解决方案1】:

在一次采访中,我被问到以下代码的输出 sn -p [...]

你的答案可能是:

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

b. “很可能会打印一个数字,但我不能告诉你哪个数字,因为我不知道字符串的存储位置,因为printf 函数将尝试将字符串的地址解释为整数”。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        “起作用”,你观察到的是 undefined behavior 的结果。

        引用C11,第 7.21.6.1/p9 章

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

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

        【讨论】:

          猜你喜欢
          • 2011-05-14
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-29
          • 2013-03-14
          • 2017-11-16
          相关资源
          最近更新 更多