'%p`在哪里对printf有用?

Moe*_*oeb 57 c c++ printf

毕竟,这两个陈述都做同样的事情......

int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
Run Code Online (Sandbox Code Playgroud)

例如(具有不同的地址):

0012FEE0
0012FEE0
Run Code Online (Sandbox Code Playgroud)

根据需要格式化指针是微不足道的%x,那么是否有一些很好的%p选择?

Pet*_*sey 124

他们不做同样的事情.后一种printf语句将其解释b为一个unsigned int错误b的指针.

指针和unsigned ints的大小并不总是相同,因此这些不可互换.当它们的大小不同时(越来越常见的情况,因为64位CPU和操作系统变得越来越普遍),%x只会打印一半的地址.在Mac(可能还有其他一些系统)上,这破坏地址; 输出将是错误的.

总是%p用于指针.

  • %p还将为平台的指针使用足够的纹理表示.在通常以十六进制表示指针的平台上,只要大小正确但对于分段体系结构(你还记得DOS吗?)它就没有区别,它可能使用一个段:偏移表示. (13认同)
  • 还需要使用`%p`格式将`b`转换为`void*` - 这是C中需要转换的少数几个实例之一. (10认同)

unw*_*ind 8

至少在一个不常见的系统上,它们不会打印相同的:

~/src> uname -m
i686
~/src> gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
[some output snipped]
gcc version 4.1.2 (Gentoo 4.1.2)
~/src> gcc -o printfptr printfptr.c
~/src> ./printfptr
0xbf8ce99c
bf8ce99c
Run Code Online (Sandbox Code Playgroud)

请注意指针版本如何添加0x前缀.始终使用%p,因为它知道指针的大小,以及如何最好地将它们表示为文本.


Tro*_*nic 5

指针的大小可能与 的大小不同int。此外,当您使用 时,实现可以产生比简单的十六进制值更好的地址表示%p


小智 5

您不能依赖于%p显示0x前缀.在Visual C++上,它没有.用于%#p携带.