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

C++中int *p=(int*)(&a+1)含义及*p值为1的原因解析问询

数组指针运算与越界访问的未定义行为解析

先拆解关键语句int *p=(int*)(&a+1);的含义:

  • &a:取的是整个数组a的地址,它的类型是指向int[5]数组的指针(int (*)[5]),并非指向单个int元素的指针。
  • &a + 1:指针加法会按指向类型的大小偏移。由于&a指向的是大小为5*sizeof(int)的数组,所以&a+1会从数组起始地址向后偏移整个数组的长度(假设sizeof(int)=4,就是偏移20字节),最终指向数组a末尾的下一个内存位置(已超出数组合法访问范围)。
  • (int*)(&a+1):把上述数组指针强制转换为int*类型,让p以单个int的视角访问这个越界地址。

关于*p输出1的原因

这属于C++标准定义的未定义行为:p指向的地址不属于数组a的合法内存区域,访问该地址的值没有固定规则,完全取决于当前程序的内存布局、编译器实现等因素。在你的测试环境中,这个越界地址恰好存储了数值1,但换个环境(比如不同编译器、操作系统、编译选项),结果可能是任意值,甚至程序崩溃。

对应输出的逐个说明

  • *(a):数组名a会隐式转换为指向第一个元素的指针,*a就是数组第一个元素的值1,所以输出1。
  • &a和&a+1:两者地址差为0x16fdff464 - 0x16fdff450 = 0x14(十进制20),正好是5*sizeof(int)(假设int占4字节),验证了&a+1确实偏移了整个数组的长度。
  • *p-1和*p-3:基于*p的值为1,计算后得到0和-2,与输出一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:57:43