在realloc之后使用原始指针?

ver*_*ose 11 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

buffer = newBuffer;
currentPosition = buffer + length;
Run Code Online (Sandbox Code Playgroud)

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

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

oua*_*uah 10

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

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

  • 引用6.2.4p2会有所帮助:"当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定." (6认同)
  • 感谢指针(har har)到标准,@ uah.我查了6.5.6p9,它明确地说"当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素." 因此,由于这些指针没有指向任何地方,所以你是对的,这是未定义的行为.它可能适用于大多数实现,但它是非标准的,因此(我怀疑)是不可取的. (4认同)
  • @ouah本节适用于"当一个具有整数类型的表达式被添加到指针或从指针中减去"时 - 在他的例子中,他正在减去两个指针. (3认同)
  • @CoryNelson C11,6.5.6p8指针算术.如果结果不在数组对象中,或者结果超过最后一个元素=>未定义的行为. (2认同)