我正在阅读理查德·里斯(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上的buffer
和currentPosition
都是指向已释放内存的指针。我的本能是重写此代码,以避免通过使用
length
来使用悬空指针,毕竟currentPosition
已经存在了。我想将后两行替换为:buffer = newBuffer;
currentPosition = buffer + length;
但是,假定编写的代码有效,因为两个指针仍保留地址(尽管是垃圾),并且仍可以计算这两个地址之间的偏移量,作为重新分配ojit_code的一种方式。那么,我是否只是对此感到不安?
概括一下这个问题:一旦指针悬空,是否可以出于任何目的(例如计算偏移量)使用指针中包含的地址?谢谢。
最佳答案
不,这不安全。在free
之后,指针值是一个无效地址,并且在不调用未定义行为的情况下,不能将无效地址用于指针算术。
关于c - 重新分配后使用原始指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17914579/