如果我没记错的话,在64位机器上,指针相当于一个介于0
and 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
or 0X
;它可能会以大写或小写形式打印十六进制。
Try printf("%p\n", (void *)0);
— 在 Mac 上,只打印0
即使其他值打印为 0x1234 样式。尝试printf("%p\n", (void *)1024);
— 它可能会打印一个简短的地址0x400
.
标准(POSIX 或 C 或 C++)中没有要求指定输出内容%p
应该看起来像。
如果您想控制指针的格式,请使用uintptr_t
和PRIzPTR
宏来自<inttypes.h>
:
void *vp = 0;
printf("0x%.16" PRIXPTR " contains 0x%" PRIXPTR "\n",
(uintptr_t)&vp, (uintptr_t)vp);
Or use PRIxPTR
如果您喜欢小写的十六进制数字。我不喜欢,但我确实喜欢0x
前缀,所以当我不受别人可疑的美学约束时我会使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)