有人可以解释第二行的输出吗?
int x=10;
printf("%d\n",x);
printf("%p\n",x);
printf("%p\n",&x);
输出:
10
0000000a
006aff0c
答案 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
:
需要符合规定的实施,以记录本子条款中列出的每个领域的行为选择。