【发布时间】:2017-01-13 16:17:19
【问题描述】:
如果我没记错的话,在 64 位机器上,指针相当于 0 和 2^64-1 之间的数字。因此得到以下结果:
printf("%p", (void*) -1); → 0xffffffffffffffff
printf("0x%lx", (uintptr_t) -1); → 0xffffffffffffffff
然而,当我从刚刚分配的对象中打印指针时,结果显示的宽度不同:
printf("%p", (void*) &myobject); → 0x70d940
有什么理由为什么我的所有对象(总是)在内存空间的开头都有一个地址?多亏了虚拟内存,可以(从程序的角度来看)基本上可以放置在 64 位空间中的任何位置。
另外,为什么%p 默认不打印全宽? (我希望表现得像0x%016lx)
编辑:另外,0x018p 无效有什么原因吗?
error : fanion « 0 » used with « %p » gnu_printf format
【问题讨论】:
-
%p可以用它选择的任何方式格式化地址。它不必是十六进制的(尽管通常是);它不必以0x或0X开头;它可能会以大写或小写形式打印十六进制。尝试printf("%p\n", (void *)0)— 在 Mac 上,这只是0,即使其他值以0x1234样式打印。试试printf("%p\n", (void *)1024);——它可能会打印一个短地址0x400。 -
为什么你认为它不是全宽?反正也没办法控制。这是一个有效值。想想正常情况,我们写“循环从1到100”,我们不写,“循环从(001)10到(100)10”,对吧?
-
我希望能像
0x%016lx那样行事你的期望是基于什么? -
@SouravGhosh:我不知道,这是我的问题。
-
@Amxx:我真的不知道还能告诉你什么。从字面上看,您想要输出的任何数字(本机类型)都是固定宽度(对于给定的架构),但我们不会无缘无故地给它们全部前导零。当您无法自己解释期望时,基于错误的期望来回答问题是非常困难的!