在阅读this SO question的答案时,我了解到越界指针算法未定义。的确,根据C99 6.5.6第8段
如果两者都有 指针操作数和结果指向相同的元素 数组对象,或者超过数组最后一个元素的对象 对象,评估不得产生溢出; 否则,行为未定义。
释放该对象会使该保证无效吗? 7.20.3.2“自由功能”似乎没有提及它,只是提到“空间被解除分配”。由于6.5.6特别提到溢出,它似乎是一个整数溢出问题,free不会影响。指向对象的指针的算术是“引用它”的行为吗?
换句话说,是:
char *foo = malloc(10);
free(foo);
foo++;
未定义?或者“溢出”的用法是不同的?
答案 0 :(得分:5)
C99§6.2.4说:
当指向的对象时,指针的值变得不确定 到达其生命的尽头。
§7.20.3描述了由malloc()
:
分配对象的生命周期从分配延伸到 解除分配。
因此,正式地说,指针foo
的值在free()
之后变得不确定,因此不能再指向任何对象。因此,增量的行为是不确定的。
答案 1 :(得分:1)
对无效指针执行算术会调用未定义的行为。