gpt4 book ai didi

c++ - 为什么 %p 不显示指针的全宽?

转载 作者:太空狗 更新时间:2023-10-29 23:39:07 25 4
gpt4 key购买 nike

如果我没记错的话,在 64 位机器上,指针相当于 02^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可以用它选择的任何方式格式化地址。它不一定是十六进制(尽管通常是);输出不必开始0x0X ;它可能会以大写或小写形式打印十六进制。

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

标准(POSIX 或 C 或 C++)中没有指定 %p 的输出内容的要求应该看起来像。

如果你想控制指针的格式,使用uintptr_tPRIzPTR来自 <inttypes.h> 的宏:

void *vp = 0;
printf("0x%.16" PRIXPTR " contains 0x%" PRIXPTR "\n",
(uintptr_t)&vp, (uintptr_t)vp);

或使用 PRIxPTR如果您更喜欢小写的十六进制数字。我不喜欢,我喜欢 0x前缀,所以当我不受别人有问题的审美限制时,这就是我使用的。

关于c++ - 为什么 %p 不显示指针的全宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com