相关疑难解决方法(0)

过去数组对象的最后一个元素的基本原理是什么?

根据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)

我希望不允许指向数组越界的元素,其解除引用作为未定义的行为(数组溢出),因此它使它具有潜在的危险性.这有什么理由吗?

c c11

5
推荐指数
1
解决办法
595
查看次数

标签 统计

c ×1

c11 ×1