数组下标可以超出数组范围吗?
下面的代码是否符合 C 标准:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
登录后复制
具体来说, &array[5] 在这种情况下的有效性是
C 标准
根据 C99 标准草案:
-
§6.5.2.1,第 2 段:“E1[E2] 与 (*((E1) (E2)))"
-
§6.5.3.2,第 3 段(强调):“如果操作数是 [] 运算符的结果,则既不是 & 运算符也不是一元 *对 [] 隐含的值进行求值,结果就好像删除了 & 运算符并将 [] 运算符更改为运算符。”
-
§6.5.6,第 8 段: “如果表达式 P 指向数组对象的最后一个元素后一位,则表达式 (P) 1 指向最后一个元素后一位数组对象的元素,如果表达式 Q 指向数组对象的最后一个元素后一位,则表达式 (Q) - 1 指向数组的最后一个元素对象。”
结论
这些规定表明:
- 指针可以合法地将一个元素指向超过一个对象末尾的一个元素数组(不被取消引用)。
- &array[5] 相当于 &*(array 5),这相当于 (array 5)。
- (array 5) 指向数组末尾的一个。
- 因为 &array[5] 不会导致取消引用,根据 C 标准是合法的。
以上是`&array[5]` 是 C 语言中超出数组范围的有效指针吗?的详细内容。更多信息请关注PHP中文网其他相关文章!