gpt4 book ai didi

c - 为什么 C 数组的 5[a] 不会超出范围?

转载 作者:行者123 更新时间:2023-11-30 21:43:52 24 4
gpt4 key购买 nike

根据帖子:With arrays, why is it the case that a[5] == 5[a]?

据称,a[5] 等于 5[a]

我问自己,这是真的吗?

虽然我同意 E1[E2] 与 (*((E1)+(E2))) 相同

但我想说:鉴于声明

int a[sizeI];

其中 if (sizeI > 5) 必须为 true

我同意 a[5] 没问题。

但与 ISO/IEC:9899 的引用相关

附录 J.2 未定义的行为:

— An array subscript is out of range, even if an object is apparently accessible with the given subscript (as in the lvalue expression a[1][7] given the declaration int a[4][5]) (6.5.6).

是(如果我从文档中得到正确的结果)5[a]“显然可以访问”,但“数组下标超出范围”所以我总体上不同意我链接的OP,因为 a[5] 在给定的情况下是明确定义的,而 5[a] 是未定义的行为。

那么,我说得对吗?还是我忘记考虑一些重要的事情?

编辑:

我的主张并不意味着

E1[E2] is identical to (*((E1)+(E2)))

这是不正确的。

还有 6.5.2.1 数组下标点 2

只是说它们在算术上是相同的。但没有说:(*((E1)+(E2))) 无法实现 UB。

因此,虽然我知道这一部分,但我找不到任何可以破坏我主张的内容

另请注意:

正如您在我的第一句话中应该看到的那样,我正在问一个与“问题”相关的不同问题

With arrays, why is it the case that a[5] == 5[a]?

所以请停止将其标记为该副本的重复项。

最佳答案

要了解为什么附录 J.2 中的注释与 a[b] 兼容,与 *(a + b) 相同,请考虑以下表达式: a[1][7] 被解释(假设声明 int a[4][5],如附录中所示):

a[1][7]*(a[1] + 7) 相同。数组 a 的每个元素都是一个五元素数组,因此 a[1] 计算结果为指向五元素数组的第一个元素的指针。如果您将 7 添加到这样的指针,那么生成的指针将指向五元素数组之外,这意味着您不允许取消引用它(标准方面 - 它在实践中可能有效)。但这正是上面表达式的作用。

顺便说一句,附录 J.2 中的注释与 a[5]5[a] 无关。如果数组至少有六个元素,那么在这两个表达式中将元素称为“明显可访问”是合理的。他们只是试图澄清,您不允许访问任何索引溢出的多维数组,即使它看起来不应该溢出多维数组的边界。这只是一个注释 - 您可以独立导出它(如上所述)。

关于c - 为什么 C 数组的 5[a] 不会超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29390143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com