正确的格式说明符打印指针或地址?

时间:2012-01-29 13:49:58

标签: c pointers format memory-address

我应该使用哪种格式说明符来打印变量的地址?我对以下地段感到困惑。

  

%u - 无符号整数

     

%x - 十六进制值

     

%p - 无效指针

哪种打印地址的最佳格式?

4 个答案:

答案 0 :(得分:39)

p是打印指针的转换说明符。使用它。

int a = 42;

printf("%p\n", (void *) &a);

请记住,省略强制转换是未定义的行为,而使用p转换说明符的打印是以实现定义的方式完成的。

答案 1 :(得分:26)

使用%p表示“指针”,不要使用其他任何东西*。标准不保证您可以像任何特定类型的整数一样处理指针,因此您实际上会使用整数格式获得未定义的行为。 (例如,%u需要unsigned int,但如果void*的大小或对齐要求与unsigned int不同,会怎样?)

*)[请参阅Jonathan的正确答案!]除了%p之外,您可以使用来自<inttypes.h>的特定于指针的宏,并在C99中添加。

所有对象指针都可以在C中隐式转换为void*,但是为了将指针作为可变参数传递,你必须显式地转换它(因为任意对象指针只是 convertible ,但相同的与void指针无关):

printf("x lives at %p.\n", (void*)&x);

答案 2 :(得分:8)

作为其他(非常好)答案的替代方案,您可以转发到uintptr_tintptr_t(来自stdint.h / inttypes.h)并使用相应的整数转换符。这样可以更灵活地指定指针的格式,但严格来说,提供这些typedef不需要实现。

答案 3 :(得分:1)

您可以使用%x%X%p;他们都是正确的。

  • 如果使用%x,则地址以小写形式给出,例如:a3bfbc4
  • 如果使用%X,则地址以大写形式给出,例如:A3BFBC4

这两个都是正确的。

如果使用%x%X,则考虑该地址的六个位置;如果使用%p,则考虑该地址的八个位置。例如: