当N出界时,为什么& a [N]不会调用UB?

时间:2013-08-02 19:33:38

标签: c arrays pointers undefined-behavior

我在很多例子中都看到了:

 #define N 5
 ....

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

 for (p = &a[0]; p < &a[N]; p++);

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

1 个答案:

答案 0 :(得分:7)

您的程序永远不会访问&a[N]处的内存,所以没关系。 C标准允许比较数组对象内部或一个结尾的指针。

编辑以下讨论:

&a[N] 导致未定义的行为 - 它完全等同于a + N。从C标准, 6.5.3.2地址和间接运算符,第3段:

  

一元 & 运算符会产生其操作数的地址...如果操作数是 [] 运算符的结果,则<强> & 运算符以及 * 暗示的一元 [] 将被评估,结果为好像删除了 & 运算符并将 [] 运算符更改为 + 运算符