如果我没有弄错,在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
Jonathan Lef.. 5
如评论中所述,
%p
可以用它选择的任何方式格式化地址.它不必是十六进制(虽然它通常是); 输出不必开始0x
或0X
; 它可能以大写或小写形式打印十六进制.
尝试printf("%p\n", (void *)0);
- 在Mac上,0
即使其他值打印0x1234样式,也会打印.尝试printf("%p\n", (void *)1024);
- 它可能会打印一个简短的地址0x400
.
标准(POSIX或C或C++)中没有要求指定输出%p
应该是什么样的.
如果要控制指针的格式,请使用uintptr_t
以下PRIzPTR
宏
:
void *vp = 0; printf("0x%.16" PRIXPTR " contains 0x%" PRIXPTR "\n", (uintptr_t)&vp, (uintptr_t)vp);
或者PRIxPTR
如果您喜欢小写的十六进制数字,请使用.我没有,而且我确实喜欢这个0x
前缀,所以当我不受别人可疑的美学限制时,我会使用它.
如评论中所述,
%p
可以用它选择的任何方式格式化地址.它不必是十六进制(虽然它通常是); 输出不必开始0x
或0X
; 它可能以大写或小写形式打印十六进制.
尝试printf("%p\n", (void *)0);
- 在Mac上,0
即使其他值打印0x1234样式,也会打印.尝试printf("%p\n", (void *)1024);
- 它可能会打印一个简短的地址0x400
.
标准(POSIX或C或C++)中没有要求指定输出%p
应该是什么样的.
如果要控制指针的格式,请使用uintptr_t
以下PRIzPTR
宏
:
void *vp = 0; printf("0x%.16" PRIXPTR " contains 0x%" PRIXPTR "\n", (uintptr_t)&vp, (uintptr_t)vp);
或者PRIxPTR
如果您喜欢小写的十六进制数字,请使用.我没有,而且我确实喜欢这个0x
前缀,所以当我不受别人可疑的美学限制时,我会使用它.