释放指针的算法

在阅读这个SO问题的答案时,我了解到越界指针算法是未定义的。 的确,根据C99 6.5.6第8段

如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义。

释放该对象会使该保证无效吗? 7.20.3.2“自由function”似乎没有提到它,只是提到“空间被解除分配”。 由于6.5.6特别提到溢出,它似乎是一个整数溢出问题,free不会影响。 指向对象的指针的算术是“引用它”的行为吗?

换句话说,是:

char *foo = malloc(10); free(foo); foo++; 

未定义? 或者“溢出”的用法是不同的?

C99§6.2.4说:

当指针指向的对象到达其生命周期的末尾时,指针的值变得不确定。

§7.20.3描述了由malloc()创建的已分配对象的生命周期:

分配对象的生命周期从分配延伸到解除分配。

所以,从forms上讲,指针foo的值在free()之后变得不确定,因此不能再指向任何对象了。 因此,增量的行为是不确定的。

对无效指针执行算术会调用未定义的行为。