使用%p打印指针地址未得到带0x的十六进制数的问题
解决C语言中printf输出指针地址不带0x前缀的问题
C标准中%p格式符的输出样式是实现定义的,GCC在部分环境(比如Windows下的MinGW)中默认输出不带0x前缀的十六进制地址,这就是你遇到的问题。
要强制输出带0x前缀的地址格式,可以通过以下两种方式解决:
方法一:使用uintptr_t配合%#x格式符
这是跨平台最可靠的方案,uintptr_t是标准定义的、能安全存储指针值的无符号整数类型。
修改后的代码
#include <stdio.h> #include <stdint.h> // 必须包含此头文件以使用uintptr_t int main(void) { char *a = "abcd"; for (int i = 0; i < 4; i++) { // 将指针转换为uintptr_t,用%#x强制输出带0x前缀的十六进制 printf("%#x\n", (uintptr_t)&a[i]); // 如果需要大写的0X前缀,改用%#X // printf("%#X\n", (uintptr_t)&a[i]); } return 0; }
输出示例
0x405064 0x405065 0x405066 0x405067
方法二:手动拼接0x前缀
如果你不想引入stdint.h,也可以直接在%p输出前手动添加0x字符串:
#include <stdio.h> int main(void) { char *a = "abcd"; for (int i = 0; i < 4; i++) { printf("0x%p\n", &a[i]); } return 0; }
注意事项
- 方法二依赖当前
%p的输出是纯十六进制数字(不带前缀),如果后续编译器或环境改变%p的输出格式(比如默认加上前缀),就会出现0x0xXXXXXX的重复前缀问题,因此方法一更推荐。
内容的提问来源于stack exchange,提问作者Ehteshamul Haque
相关产品推荐
相关产品推荐

