首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么%p不显示指针的全部宽度?

为什么%p不显示指针的全部宽度?
EN

Stack Overflow用户
提问于 2017-01-13 16:17:19
回答 4查看 1K关注 0票数 2

如果我没有弄错,在64位机器上,指针相当于02^64-1之间的数字。因此,取得了以下结果:

代码语言:javascript
运行
复制
printf("%p",    (void*)     -1); → 0xffffffffffffffff
printf("0x%lx", (uintptr_t) -1); → 0xffffffffffffffff

然而,当我从刚分配的对象中打印指针时,结果显示的宽度并不相同:

代码语言:javascript
运行
复制
printf("%p", (void*) &myobject); → 0x70d940

在内存空间开始的时候,为什么我所有的对象(总是)都有进位的原因吗?由于有了虚拟内存,(从程序的角度来看)它可以放置在64位空间的任何地方。

另外,为什么%p在默认情况下不打印全部宽度?(我希望如果表现得像0x%016lx那样)

编辑:还有,为什么0x018p无效?

代码语言:javascript
运行
复制
error : fanion « 0 » used with « %p » gnu_printf format
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-13 16:44:37

正如在一篇评论中指出的,

%p可以以它选择的任何方式格式化地址。它不必是十六进制(尽管它通常是十六进制的);输出不必启动0x0X;它可以打印大写或小写的十六进制。

试试printf("%p\n", (void *)0); --在Mac上,即使其他值打印为0x1234样式,也只打印0。试试printf("%p\n", (void *)1024); --它可能会打印一个短地址0x400

标准(POSIX、C或C++)中没有规定来自%p的输出应该是什么样子的要求。

如果您希望控制指针的格式,请使用uintptr_t<inttypes.h>中的PRIzPTR宏。

代码语言:javascript
运行
复制
void *vp = 0;
printf("0x%.16" PRIXPTR " contains 0x%" PRIXPTR "\n",
       (uintptr_t)&vp, (uintptr_t)vp);

或者使用PRIxPTR,如果您喜欢小写十六进制数字。我不喜欢,而且我也喜欢0x前缀,所以当我不受别人怀疑的美学约束时,我就会用这个前缀。

票数 5
EN

Stack Overflow用户

发布于 2017-01-13 16:46:54

通过%p格式说明符精确表示指针的实现是定义的。

来自C标准 7.21.6.1节

p参数应该是指向void的指针。指针的值以实现定义的方式转换为打印字符序列。

特别是在Linux上,手册页声明如下:

void *指针参数以十六进制形式打印(好像由%#x%#lx打印)。

所以如果你在Linux上的话,,你可以通过使用%#016lx来逃避

但是,这只是一个实现,所以您不能在符合规范的C应用程序中假设任何关于格式的内容。

例如,在DOS上运行的Turbo上,指针实际上包含两个值,一个段和一个偏移量。

票数 2
EN

Stack Overflow用户

发布于 2017-01-13 16:32:13

这是因为在大多数C++实现中,指针打印(%p)会抑制前导零,从而使事物更具可读性。您可以在打印时使用格式化技巧来获得完整的地址宽度。

编辑:我提到的“格式化技巧”:

代码语言:javascript
运行
复制
std::cout
<< "0x"
<< std::hex
<< std::noshowbase
<< std::setw(2)
<< std::setfill('0')
<< n
<< std::endl ;

取自https://stackoverflow.com/a/30326177/7407065

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41639002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档