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)
是不确定的行为?如果不,那么为什么?
行为始终未定义.你永远不能拥有NULL的内存.
指针算法仅在数组中有效,您可以设置指向数组索引的指针或超出最终元素的一个位置.注意我在谈论在这里设置指针,而不是取消引用它.
您还可以设置指向标量的指针和标量之前的指针.
您不能使用指针算法来遍历您拥有的其他内存.
是的,它会导致未定义的行为.
任何运算符都需要"有效"操作数,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元素,前提是它们存在.[....]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.