在C中递增NULL指针

msc*_*msc 4 c null pointers undefined-behavior

如果我NULL在C中递增指针,那么会发生什么?

#include <stdio.h>

typedef struct
{
        int x;
        int y;
        int z;
}st;

int main(void)
{
        st *ptr = NULL;
        ptr++; //Incrementing null pointer 
        printf("%d\n", (int)ptr);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

12
Run Code Online (Sandbox Code Playgroud)

不确定的行为?如果,那么为什么

Bat*_*eba 6

行为始终未定义.你永远不能拥有NULL的内存.

指针算法仅在数组中有效,您可以设置指向数组索引的指针或超出最终元素的一个位置.注意我在谈论在这里设置指针,而不是取消引用它.

您还可以设置指向标量的指针和标量之前的指针.

您不能使用指针算法来遍历您拥有的其他内存.


Sou*_*osh 5

是的,它会导致未定义的行为.

任何运算符都需要"有效"操作数,NULL而不是后增量运算符.

引用C11,章节§6.5.2.4

后缀++运算符的结果是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中).[....]

并且与加法运算符有关,§6.5.6

另外,两个操作数都应具有算术类型,或者一个操作数应是指向完整对象类型的指针,另一个操作数应具有整数类型.(递增相当于添加1.)

P7,

[...]指向不是数组元素的对象的指针与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型.

和,P8,

如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式.换句话说,如果表达式P指向i数组对象的-th元素,则表达式(P)+N(等效地N+(P))和 (P)-N(其中N有值n)分别指向数组对象的i+n第-th和i?n-th元素,前提是它们存在.[....]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.

  • 你能添加一个引用项目的链接吗? (3认同)