我读理查德·里斯的新的(2013年5月)O'Reilly出版的“了解和使用C指针,指向”,我有一个关于一些代码其中的问题,第85页上realloc后使用原始指针?
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
,毕竟它已经在附近。我想,以取代最后两行:
buffer = newBuffer;
currentPosition = buffer + length;
然而,想必代码写的作品,因为这两个指针仍持有地址(尽管垃圾),以及这两个地址之间的偏移仍然可以被计算为一种重新分配的方式currentPosition
。那么,我是否只是在对此感到不安呢?
为了概括这个问题:一旦指针悬空,是否可以安全地使用包含在指针中的地址用于任何目的,比如计算偏移量?谢谢。
在重新分配时,“length”大于缓冲区的大小(调整前的maximumLength)。如果我正确解释意义,你应该使用'currentPosition = buffer + length - 1'。 – Casey
实际上,我在发布问题之前检查过。该书的代码将“length”和“currentPosition”初始化为零。 'length'在第一个条件中增加,所以它总是超过最后一个添加的元素的索引。 'currentPosition'是新元素被添加的地方,并且在添加之后得到递增。这不是我如何编写代码开始的,但是按照给定的代码,'buffer + length'是正确的。 – verbose
所以'currentPosition'是一个预先组成的'buffer + length'?我立场纠正(并且被冗余略微困惑)。 – Casey