释放指针的算法

时间:2012-07-31 05:40:45

标签: c pointers language-lawyer

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

  

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

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

换句话说,是:

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

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

2 个答案:

答案 0 :(得分:5)

C99§6.2.4说:

  

当指向的对象时,指针的值变得不确定   到达其生命的尽头。

§7.20.3描述了由malloc()

创建的已分配对象的生命周期
  

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

因此,正式地说,指针foo的值在free()之后变得不确定,因此不能再指向任何对象。因此,增量的行为是不确定的。

答案 1 :(得分:1)

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