3

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

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

释放该对象是否会使该保证失效?7.20.3.2 “The Free Function” 好像没提,只提“空间被释放”。由于 6.5.6 特别提到了溢出,这似乎是一个整数溢出问题,free 不会影响。对指向对象的指针的算术是“引用它”的行为吗?

换句话说,就是:

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

不明确的?还是“溢出”的用法不同?

4

2 回答 2

5

C99 §6.2.4 说:

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

§7.20.3 描述了分配对象的生命周期,由以下人员创建malloc()

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

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

于 2012-07-31T05:53:49.367 回答
1

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

于 2012-07-31T05:44:03.663 回答