You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:50:20