释放指针的算法

Dav*_*ave 3 c pointers language-lawyer

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

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

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

换句话说,是:

char *foo = malloc(10);
free(foo);
foo++;
Run Code Online (Sandbox Code Playgroud)

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

caf*_*caf 5

C99§6.2.4说:

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

§7.20.3描述了分配对象的生命周期,如下所示malloc():

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

所以,从形式上讲,指针的值在foo变为不确定之后free(),因此不再可以说是指向任何对象.因此,增量的行为是不确定的.

  • 你甚至不能依赖构成指针的字节保持不变.C标准在这方面允许很大的自由度.考虑一个进程必须管理自己的内存的实现,因为硬件不支持虚拟内存.在该实现中,指针可以被实现为存储器中的结构的地址,其具有附加信息,诸如实际数据的磁盘位置.指针的"值"将包括这样的附加信息.(下面继续.) (2认同)