如果我们在打印int时使用%p而不是%d会发生什么

时间:2017-09-04 01:15:59

标签: c pointers int

有人可以解释第二行的输出吗?

int x=10;
printf("%d\n",x);
printf("%p\n",x);
printf("%p\n",&x);

输出:

10
0000000a
006aff0c

1 个答案:

答案 0 :(得分:7)

在您的情况下,它似乎将值10视为指针并将其输出为第八位,左边填零,十六进制数(a)< / SUP>

但是,符合C11 7.21.6.1 The fprintf function, /9(以下所有标准引用也引用C11):

  

如果转换规范无效,则行为未定义。 如果任何参数不是相应转换规范的正确类型,则行为未定义。

因此,从字面上看,允许发生任何。您通常希望尽可能避免未定义的行为,因为行为可能会在实现,版本甚至是星期几之间发生变化: - )

您的第三个​​行在技术上也存在问题。标准在7.21.6.1 /8转换说明符的p中说明:

  

参数应该是指向void的指针。 指针的值是   转换为一系列打印字符,在实现定义中   方式。

由于&x实际上是指向int的指针,因此违反了相同的合同。你可能应该使用这样的东西:

printf ("%p\n", (void*)(&x));

(a) 实际所做的是实现定义,如上面最终引文中的第二句。它基本上可以执行任何操作,前提是实现文档,如J.3 Implementation-defined behavior

中所述
  

需要符合规定的实施,以记录本子条款中列出的每个领域的行为选择。