作者:dfpkgih | 来源:互联网 | 2023-02-05 13:24
如果我NULL
在C中递增指针,那么会发生什么?
#include
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;
}
输出:
12
是不确定的行为?如果不,那么为什么?
1> Bathsheba..:
行为始终未定义.你永远不能拥有NULL的内存.
指针算法仅在数组中有效,您可以设置指向数组索引的指针或超出最终元素的一个位置.注意我在谈论在这里设置指针,而不是取消引用它.
您还可以设置指向标量的指针和标量之前的指针.
您不能使用指针算法来遍历您拥有的其他内存.
2> Sourav Ghosh..:
是的,它会导致未定义的行为.
任何运算符都需要"有效"操作数,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元素,前提是它们存在.[....]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.
你能添加一个引用项目的链接吗?