为何使用%d与%p格式化指针会输出不同值?
为什么用%d和%p输出指针会得到不同结果?
首先直接给结论:你的猜测完全正确——用%d输出指针时,确实是把指针强制转换成了整数来输出,这也是两个结果存在差异的核心原因。
先拆解两个输出的本质差异
你看到的两个结果其实是同一个内存地址的不同表示形式:
6356744是地址的十进制整数形式0060FF08是同一个地址的十六进制形式(%p默认以十六进制打印指针,并且会补前导零到系统指针的标准宽度,比如32位系统就是8位十六进制)
你可以自己验证一下:把十进制的6356744转换成十六进制,结果就是0x60FF08,和%p输出的0060FF08完全一致(只是多了前导零补位)。
具体是怎么把指针转成整数的?
这要从printf的可变参数特性说起:
printf是可变参数函数,它不会主动检查你传入的参数类型和格式符是否匹配。当你传入指针a(类型是int*),却用%d(对应int类型)来解析时,它会直接把指针存储的二进制值当成int类型的二进制值来处理。- 在32位系统中,
int和指针的大小都是4字节,所以这个转换过程就是直接把指针的4字节二进制数据原封不动地解释成int,然后转换成十进制输出。比如你的例子里,指针a存储的地址是0x0060FF08,这个二进制值作为int计算的话,结果就是十进制的6356744。 - 要是在64位系统里,指针大小是8字节,而
int通常是4字节,这时候用%d输出指针就会出现截断,得到错误的结果——这也是为什么这种用法是C标准里的未定义行为,绝对不要依赖它来输出指针。
额外提醒
输出指针的正确方式永远是用%p格式符,它会根据系统的指针大小和格式规范来正确打印地址,避免出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者thenoobcoder
相关产品推荐
相关产品推荐

