重新分配后使用原始指针?

2023-11-27

我正在阅读 Richard Reese 的 O'Reilly 新书(2013 年 5 月)“理解和使用 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()就是当新的分配成功时,原来分配的内存被释放。如果这是正确的,那么有问题的行正在使用悬空指针,不是吗?两个都buffer and currentPosition该表达式的右侧是指向已释放内存的指针。

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

buffer = newBuffer;
currentPosition = buffer + length;

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新分配后使用原始指针? 的相关文章

随机推荐