根据N1570(C11草案)6.5.6/8 添加剂操作员:
此外,如果表达式
P指向数组对象的最后一个元素,则表达式(P)+1指向数组对象的最后一个元素之后,如果表达式Q指向一个超过数组对象的最后一个元素,则表达式(Q)-1指向最后一个元素数组对象
子条款6.5.6/9还包含:
此外,如果表达式
P指向要么一个数组对象或一个过去的阵列对象的最后元件,并且表达的元件Q指向相同的数组对象的最后一个元素时,表达((Q)+1)-(P)具有相同的值((Q)-(P))+1和作为-((P)-((Q)+1)),和如果表达式P指向一个超过数组对象的最后一个元素的值,则值为零,即使该表达式(Q)+1未指向数组对象的元素.106)
这证明指针的算术是有效的:
#include <stdio.h>
int main(void)
{
int a[3] = {0, 1, 2};
int *P, *Q;
P = a + 3; // one past the last element
Q = a + 2; // last element
printf("%td\n", ((Q)+1)-(P));
printf("%td\n", ((Q)-(P))+1);
printf("%td\n", -((P)-((Q)+1)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望不允许指向数组越界的元素,其解除引用作为未定义的行为(数组溢出),因此它使它具有潜在的危险性.这有什么理由吗?