1

我在许多示例中看​​到它是这样写的:

 #define N 5
 ....

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

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

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

4

1 回答 1

7

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

编辑以下讨论:

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

一元运算&符产生其操作数的地址……如果操作数是运算符的结果,[]&运算符和*隐含的一元都不会[]被计算,结果就好像&运算符被删除并且[]运算符被更改为+操作员。

于 2013-08-02T19:35:06.873 回答