关于C语言printf中%p输出int强制转换结果的疑问
为什么将int值转成指针后用%p输出会得到其十六进制值?
你的代码里做了两步关键转换,咱们一步步拆解:
(size_t)b的转换
size_t是C标准定义的无符号整数类型,专门用来表示内存相关的尺寸或偏移值。这里把int类型的30转成size_t,数值上还是30,没有变化。(void *)(size_t)b的转换
这一步是把无符号整数转换成void指针。C标准里,整数和指针之间的转换属于实现定义行为,但在x86-64 Linux环境下,编译器会直接把整数的值当作指针的地址来处理——简单说就是把30当成了一个内存地址的数值。%p格式符的输出逻辑
printf的%p格式符专门用来输出指针值,它会把指针的地址值转换成十六进制格式,并且自动加上0x前缀。30的十六进制就是0x1e,所以最终输出的就是这个结果。
另外要提醒一句:这种把普通整数直接转成指针的写法其实非常危险,因为这个地址几乎肯定是无效的内存区域,如果后续尝试通过这个指针访问内存,会直接触发段错误或者其他未定义行为。你现在只是输出地址值所以没出问题,但实际开发中千万别这么用。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

