在realloc之后使用原始指针?

时间:2013-07-29 00:56:33

标签: c pointers realloc

我正在阅读Richard Reese的新书(2013年5月)O'Reilly的书“理解和使用C指针”,我对其中的一些代码有疑问,第87页。

if (++length > maximumLength) {
    char *newBuffer = realloc (buffer, maximumLength += sizeIncrement);

    if (newBuffer == NULL) {
        free (buffer);
        return NULL;
    }

    currentPosition = newBuffer + (currentPosition - buffer);
    buffer = newBuffer;
}

我希望变量的名称不言自明;如果需要上下文,我将编辑以提供整个代码块而不仅仅是这段摘录。

我的问题是关于currentPosition = newBuffer + (currentPosition - buffer);行。我对realloc()的理解是,当新分配成功时,最初分配的内存被释放。如果这是正确的,那么有问题的线是使用悬空指针,不是吗?该表达式的RHS上的buffercurrentPosition都是指向已释放的内存的指针。

我的直觉是重写这个以避免使用length使用悬空指针,这毕竟已经存在了。我想用以下代码替换最后两行:

buffer = newBuffer;
currentPosition = buffer + length;

然而,大概写入的代码是有效的,因为两个指针仍然保存地址(尽管是垃圾),并且这两个地址之间的偏移仍然可以作为重新分配currentPosition的方式来计算。那么,我是否只是对此感到不安呢?

概括问题:一旦指针悬空,是否可以安全地使用指针中包含的地址用于任何目的,例如计算偏移量?谢谢。

2 个答案:

答案 0 :(得分:10)

  

一旦指针悬空,是否可以安全地使用指针中包含的地址用于任何目的,例如计算偏移量?

不,这不安全。在free之后,指针值是无效地址,无效地址不能用于指针运算而不调用未定义的行为。

答案 1 :(得分:0)

只要您不尝试取消引用指针(即应用运算符*),使用悬空指针(例如“指针运算”)是安全的。