在不取消引用的情况下保持指针越界是否安全?

在 C 中保持指针越界(不取消引用)以进行进一步的算术是否安全?

void f(int *array)
{
    int *i = array - 1;  // OOB

    while(...) {
        ++i;
        ...
    }
}

void g(int *array, int *end /* past-the-end pointer: OOB */)
{
    while(array != end) {
        ...
        ++array;
    }
}

我想象一些极端情况,如果地址是内存的第一个或最后一个......

回答

允许将指针移动到最后一个元素之后的一个元素,但不允许进一步移动或移动到第一个元素之前。

引自N1570 6.5.6 加法运算符(第 8 点):

当具有整数类型的表达式与指针相加或相减时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向与原始元素的元素偏移量,使得结果和原始数组元素的下标之差等于整数表达式。换句话说,如果表达式 P 指向数组对象的第 i 个元素,则表达式 (P)+N(等价于 N+(P))和 (P)-N(其中 N 的值为 n)指向分别指向数组对象的第 i+n 个和第 i?n 个元素,前提是它们存在。此外,如果表达式 P 指向数组对象的最后一个元素,则表达式 (P)+1 指向数组对象的最后一个元素,如果表达式 Q 指向数组对象的最后一个元素,则表达式 (Q)-1 指向数组对象的最后一个元素。如果指针操作数和结果都指向同一个数组对象的元素,或者数组对象的最后一个元素之后,求值不会产生溢出;否则,行为未定义。如果结果指向数组对象的最后一个元素,则不应将其用作被评估的一元 * 运算符的操作数。


以上是在不取消引用的情况下保持指针越界是否安全?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>