我在很多例子中都看到了:
#define N 5
....
int a[N], *p;
....
for (p = &a[0]; p < &a[N]; p++);
很明显a[N]
不存在,那么为什么编译器没有给出任何警告(如出界)或错误或是否调用UB?
答案 0 :(得分:7)
您的程序永远不会访问&a[N]
处的内存,所以没关系。 C标准允许比较数组对象内部或一个结尾的指针。
编辑以下讨论:
&a[N]
不导致未定义的行为 - 它完全等同于a + N
。从C标准, 6.5.3.2地址和间接运算符,第3段:
一元
&
运算符会产生其操作数的地址...如果操作数是[]
运算符的结果,则<强>&
运算符以及*
暗示的一元[]
将被评估,结果为好像删除了&
运算符并将[]
运算符更改为+
运算符