首页 >后端开发 >C++ >获取 C 数组末尾的地址合法吗?

获取 C 数组末尾的地址合法吗?

Susan Sarandon
Susan Sarandon原创
2024-12-26 07:18:45404浏览

Is Taking the Address One Past the End of a C   Array Legal?

C 标准允许获取数组元素的地址吗?

下面的代码片段引发了关于根据 C 标准,其有效性:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

具体来说, &array[5] 是合法的 C 表达式吗在这种情况下?

根据 C 标准的合法性

C 标准定义了此表达式的合法性:

  • C 17 标准 6.5.2.1,第 2 段: 将 E1[E2] 定义为与(*((E1) (E2))).
  • C 17 标准 6.5.3.2,第 3 段: 声明对于 [] 表达式, & 运算符和隐含的 * 是未评估,结果为 &(E1 E2)。
  • C 17 标准 6.5.6,段落8: 允许指针指向超出数组末尾的一个元素,但禁止取消引用它们。

解释

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

&array[5] = &*(array + 5) = (array + 5)

由于(数组 5)点超出数组末尾且未取消引用,它是符合 C 标准的合法表达式

与 C 标准的比较

此行为也符合 C 标准,它允许获取超出数组末尾的元素的地址,前提是它们不是

不同处理的原因

对数组 5 和 &array[4] 1 进行不同处理的决定源于这些表达式的不同目的:

  • 数组 5 提供了一个超出数组末尾的指针,允许比较和遍历数组之外的内容数组的边界。
  • &array[4] 1 尝试创建对不存在元素的引用,这将导致未定义的行为。

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

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