为什么&N [N]在N超出界限时不会调用UB?

hac*_*cks 1 c arrays pointers undefined-behavior

我在很多例子中看到它写道:

 #define N 5
 ....

 int a[N], *p;
 ....

 for (p = &a[0]; p < &a[N]; p++);
Run Code Online (Sandbox Code Playgroud)

很明显,a[N]不存在,那么为什么编译器没有给出任何警告(如出界)或错误或者它是否调用UB?

Car*_*rum 7

&a[N]程序永远不会访问内存,所以没关系.C标准允许比较数组对象内部或之后的指针.

编辑以下讨论:

&a[N]不会导致未定义的行为-这是完全等价a + N.从C标准,6.5.3.2地址和间接运营商,第3段:

一元运算&符产生其操作数的地址...如果操作数是[]运算符的结果,则&运算符和*由其暗示的一元一元都不[]被计算,结果就好像&运算符被移除并且[]运算符被更改为+运营商.

  • @DrewMcGowen不,我是说`*(a + i)`如果`i`超出界限则应该调用UB - 无论该表达式用作什么操作数.我完全清楚,如果`a`是一个大小为'n`的数组,`a + n`是合法的.事实证明我错了 - 我刚检查过,标准确实特别说`&foo [bar]`和`foo + bar`一样.所以我很糟糕. (3认同)
  • 在这里你说:"一元**和`**运算符产生其操作数的地址....如果操作数是**`[]`**运算符的结果,则不是**`&`**运算符和**`[]`**暗示的一元**`*`**被评估,结果就好像**'&`**运算符被删除了**[]`**运算符被更改为**`+`**运算符." 从**6.5.3.2地址和间接运营商**,第3段. (3认同)
  • 我要把这一点编辑成答案; 我认为它足够相关.这肯定引起了很多讨论. (2认同)