关于整型变量地址指针运算合法性的疑问
关于整型变量地址指针运算合法性的疑问
嘿,这个问题问得特别到位,咱们把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
相关产品推荐
相关产品推荐

