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

为何用%d输出指针地址会出现负值?%p与%d的区别解析

关于指针输出格式与地址正负的问题解析

咱们一步步拆解你遇到的这些现象,把底层逻辑讲清楚:

1. 为什么用%d输出指针会出现负值?

%d是C语言专门用来输出**32位有符号整数(int类型)**的格式符,但在64位系统里,指针(比如int*)是64位的内存地址。当你强行用%d输出指针时,会把64位的地址截断成低32位,然后按照有符号整数的规则去解析。

如果数组的地址刚好落在内存的高半区,截断后的32位数值最高位是1(这是有符号数的符号位),那么这个值就会被解析成负数。你第一次得到的-20578720,就是这种截断+符号解析后的结果。

2. 修改q为整型后地址变正值?这只是巧合!

你修改代码后,p和r依然是指针,用%d输出它们得到了正数,但这和你修改q没有任何直接关系——只是这次程序运行时,数组a被分配到了内存的低半区,截断后的32位数值最高位是0,按照有符号整数解析就是正数。

每次程序启动时,栈上变量的地址会因为系统内存分配的随机性而变化,所以有时候输出负、有时候输出正,这都是未定义行为的表现,完全不可靠。

3. 为什么%p是正确的选择?

%p是C标准专门为输出指针地址设计的格式符:它会自动适配系统的指针位数(32位或64位),不会截断地址值,并且默认以十六进制(带0x前缀)的形式输出,完全符合语言标准,不会出现任何解析错误。

另外提个小细节:你原代码里的int* q=&a;其实存在类型不匹配的问题——&a的类型是int (*)[2](指向包含2个int的数组的指针),而q是int*,编译器应该会给出警告,这也是写代码时要注意的类型兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:05:52