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

关于整型变量地址指针运算合法性的疑问

关于整型变量地址指针运算合法性的疑问

嘿,这个问题问得特别到位,咱们把C语言指针运算的规矩掰扯明白就清楚了~

首先得先理清楚几个基础前提:

  • &i 是一个指向 int 类型的指针(类型为 int*),精准指向变量 i 所在的内存位置。
  • C语言的指针运算不是直接加数字对应的字节数,而是按指针指向的类型大小来偏移的——比如 int* 指针加1,实际会跳过 sizeof(int) 个字节的内存。

为啥 &i + 1 是定义良好的?

C标准里有个很关键的规则:单个变量可以被当作「长度为1的虚拟数组」来看待。对于数组来说,我们完全可以合法地获取「数组末尾之后第一个位置」的指针(也就是常说的尾后指针)——哪怕这个位置并没有实际的变量,只要你不去解引用这个指针,仅仅是持有它是被标准允许的。
放到变量 i 这里,&i 就相当于这个虚拟单元素数组的首指针,&i + 1 就是这个虚拟数组的尾后指针,刚好卡在标准允许的合法范围内,所以它的行为是明确的。

为啥 &i + 2 是未定义行为?

刚才说的合法范围只到「尾后一个位置」,&i + 2 相当于在那个虚拟数组的尾后指针基础上,再往后跳一个 int 大小的内存,这就直接超出了标准允许的指针有效边界。C标准对这种「超出尾后一个位置之外」的指针运算没有任何行为保证——编译器可能生成不符合预期的优化代码,或者这个位置的内存根本不属于你的程序,甚至可能触发硬件的内存保护错误,所以这种操作是未定义的。

简单一句话总结:

  • &i + 1:属于虚拟单元素数组的尾后指针,合法合规。
  • &i + 2:超出了指针的有效范围,行为完全不可控。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:29:52