gpt4 book ai didi

c - 如何添加/减去指向堆不同部分的指针(在 C 中)

转载 作者:太空狗 更新时间:2023-10-29 15:29:36 25 4
gpt4 key购买 nike

在我正在编写的程序中,我正在实现二叉树和链表结构;因为我不知道我需要多少个节点,所以我将它们放在堆上并让程序在需要更多空间时使用 realloc()。

问题是这样的结构包含指向同一结构中其他位置的指针,并且由于 realloc() 移动了结构,我需要重做所有这些指针(除非我将它们更改为偏移量,但这增加了复杂性代码和使用该结构的成本,这比重新分配更常见)。

现在,这可能不是问题;我可以只用旧指针,从新指针中减去它,然后将结果添加到我需要更改的每个指针。但是,这仅在可以减去两个指针并获得它们地址的差异(然后将该差异添加到另一个指针以获得指针前面许多字节的指针)时才有效;因为我在堆上工作,所以我不能保证地址的差异可以被条目的大小整除,所以正常的指针减法(给出中间对象的数量)会引入错误。那么,我如何让它给出字节的差异,并且即使它们位于堆的两个不同部分中也能正常工作?

最佳答案

要获得两个指针之间的字节差,将它们转换为 char *:

(char *) ptrA - (char *) ptrB;

但是,如果您想实现所有节点共享同一 block 内存的二叉树或链表,请考虑使用结构数组,并将指针替换为数组索引。将指针用于链表或树而不是结构数组的主要优点是您可以单独添加或删除节点而无需重新分配内存或移动其他节点,但是通过使节点共享同一个数组,您正在否定这个优势。

关于c - 如何添加/减去指向堆不同部分的指针(在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18114008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com