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

标签 c undefined-behavior

根据帖子: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/

相关文章:

c - 如何在C中使用空格和多行来编写?

c - 如何删除链接列表

c++ - 静态存储持续时间对象的破坏和未定义的行为

c++ - 代码的有效性

calloc、malloc 和动态结构分配

c - 返回字符串指针

c - 如何使用文件描述符检查文件是否仍然存在

c - 未定义的行为是否改变了文字数组?

c++ - 为什么在 C++11 中不删除具有副作用未定义行为的析构函数的对象?

javascript - 为什么 Number.isNaN ('abc' ) 的结果是假的?