当前位置:  开发笔记 > 编程语言 > 正文

为什么%p不显示指针的整个宽度?

如何解决《为什么%p不显示指针的整个宽度?》经验,为你挑选了1个好方法。

如果我没有弄错,在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可以用它选择的任何方式格式化地址.它不必是十六进制(虽然它通常是); 输出不必开始0x0X; 它可能以大写或小写形式打印十六进制.

尝试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前缀,所以当我不受别人可疑的美学限制时,我会使用它.



1> Jonathan Lef..:

如评论中所述,

%p可以用它选择的任何方式格式化地址.它不必是十六进制(虽然它通常是); 输出不必开始0x0X; 它可能以大写或小写形式打印十六进制.

尝试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前缀,所以当我不受别人可疑的美学限制时,我会使用它.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有