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

关于C语言printf中%p输出int强制转换结果的疑问

为什么将int值转成指针后用%p输出会得到其十六进制值?

你的代码里做了两步关键转换,咱们一步步拆解:

  1. (size_t)b的转换
    size_t是C标准定义的无符号整数类型,专门用来表示内存相关的尺寸或偏移值。这里把int类型的30转成size_t,数值上还是30,没有变化。

  2. (void *)(size_t)b的转换
    这一步是把无符号整数转换成void指针。C标准里,整数和指针之间的转换属于实现定义行为,但在x86-64 Linux环境下,编译器会直接把整数的值当作指针的地址来处理——简单说就是把30当成了一个内存地址的数值。

  3. %p格式符的输出逻辑
    printf的%p格式符专门用来输出指针值,它会把指针的地址值转换成十六进制格式,并且自动加上0x前缀。30的十六进制就是0x1e,所以最终输出的就是这个结果。

另外要提醒一句:这种把普通整数直接转成指针的写法其实非常危险,因为这个地址几乎肯定是无效的内存区域,如果后续尝试通过这个指针访问内存,会直接触发段错误或者其他未定义行为。你现在只是输出地址值所以没出问题,但实际开发中千万别这么用。

内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:39:57