首页 >后端开发 >C++ >在 C 中获取数组元素末尾一位的地址合法吗?

在 C 中获取数组元素末尾一位的地址合法吗?

Linda Hamilton
Linda Hamilton原创
2024-12-18 01:40:10468浏览

Is it Legal in C   to Take the Address of an Array Element One Past the End?

你能取得数组元素的地址吗?

下面的代码一直是编程中争论的话题社区:

具体来说,&array[5]在这种情况下是否是合法的C代码的问题有

C 标准的立场

根据 C 标准,具体为:

  • §6.5.2.1:下标指定 (E1[E2]) 相当于 *((E1) (E2)).
  • §6.5.3.2:当您获取 [] 运算符生成的表达式的地址时,相当于将 [] 替换为 .

的含义&array[5]

将这些规则应用到 &array[5],我们有:

  • &array[5] 相当于 &array[0] 5。
  • &array[0] 5 点超过末尾的一个元素

合法吗?

是的,合法。该标准明确允许指针指向超出数组末尾的一个元素,前提是它们没有取消引用。在这种情况下,&array[5]仅用于获取地址,而不是访问该地址处的值,因此它在标准允许的范围内。

为什么与array 5 或 &array[4] 1?

&array[5] 的行为与 array 5 或 &array[4] 1 不同,因为和 [] 运算符的优先级与 [] 隐含的一元 * 运算符的行为相结合。具体来说:

  • 数组 5 被计算为 *(array 5),它试图取消引用指向数组末尾的指针,这是未定义的行为。
  • &array[4 ] 1 被计算为 &*(array 4) 1,这相当于数组 5,因此也尝试取消引用指向 1 末尾的指针

相反,&array[5] 的计算方式就好像删除了 & 运算符并将 [] 运算符更改为运算符,结果是数组 5,但没有对一元进行计算* 运算符。

以上是在 C 中获取数组元素末尾一位的地址合法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn