如果我没有弄错,在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
发布于 2017-01-13 16:44:37
正如在一篇评论中指出的,
%p
可以以它选择的任何方式格式化地址。它不必是十六进制(尽管它通常是十六进制的);输出不必启动0x
或0X
;它可以打印大写或小写的十六进制。
试试printf("%p\n", (void *)0);
--在Mac上,即使其他值打印为0x1234样式,也只打印0
。试试printf("%p\n", (void *)1024);
--它可能会打印一个短地址0x400
。
标准(POSIX、C或C++)中没有规定来自%p
的输出应该是什么样子的要求。
如果您希望控制指针的格式,请使用uintptr_t
和<inttypes.h>
中的PRIzPTR
宏。
void *vp = 0;
printf("0x%.16" PRIXPTR " contains 0x%" PRIXPTR "\n",
(uintptr_t)&vp, (uintptr_t)vp);
或者使用PRIxPTR
,如果您喜欢小写十六进制数字。我不喜欢,而且我也喜欢0x
前缀,所以当我不受别人怀疑的美学约束时,我就会用这个前缀。
发布于 2017-01-13 16:46:54
发布于 2017-01-13 16:32:13
这是因为在大多数C++实现中,指针打印(%p)会抑制前导零,从而使事物更具可读性。您可以在打印时使用格式化技巧来获得完整的地址宽度。
编辑:我提到的“格式化技巧”:
std::cout
<< "0x"
<< std::hex
<< std::noshowbase
<< std::setw(2)
<< std::setfill('0')
<< n
<< std::endl ;
https://stackoverflow.com/questions/41639002
复制相似问题