我应该使用哪种格式说明符来打印变量的地址?我对以下地段感到困惑。
%u - 无符号整数
%x - 十六进制值
%p - 无效指针
哪种打印地址的最佳格式?
答案 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_t
或intptr_t
(来自stdint.h
/ inttypes.h
)并使用相应的整数转换符。这样可以更灵活地指定指针的格式,但严格来说,提供这些typedef不需要实现。
答案 3 :(得分:1)
您可以使用%x
或%X
或%p
;他们都是正确的。
%x
,则地址以小写形式给出,例如:a3bfbc4
%X
,则地址以大写形式给出,例如:A3BFBC4
这两个都是正确的。
如果使用%x
或%X
,则考虑该地址的六个位置;如果使用%p
,则考虑该地址的八个位置。例如: