我正在阅读理查德·里斯(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来使用悬空指针,毕竟currentPosition已经存在了。我想将后两行替换为:
buffer = newBuffer;
currentPosition = buffer + length;

但是,假定编写的代码有效,因为两个指针仍保留地址(尽管是垃圾),并且仍可以计算这两个地址之间的偏移量,作为重新分配ojit_code的一种方式。那么,我是否只是对此感到不安?

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

最佳答案



不,这不安全。在free之后,指针值是一个无效地址,并且在不调用未定义行为的情况下,不能将无效地址用于指针算术。

关于c - 重新分配后使用原始指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17914579/

10-11 21:32
查看更多