【发布时间】:2019-12-17 15:57:24
【问题描述】:
我找不到 realloc 函数的任何源代码,它似乎违反了 C 的基本规则:重新分配不需要内存的长度。
如何在不知道原始内存长度的情况下重新分配内存?
如何自己实现这个功能?
【问题讨论】:
-
malloc分配的内存通常有一个包含此信息的标头,通常位于内存中 malloc 返回的指针之前(实现可能不同,但这是一种常见的方法)。此信息是 C 库的内部信息。这就是允许free在不使用大小参数的情况下工作的原因。如果你想实现realloc,你可能也想实现malloc和朋友们。 -
@JL2210 在单个文件中实现真实、完整和高效(能够实际调整块大小,包括
mremap的使用)。 -
realloc和free仅在传递的指针用于先前使用相关分配例程分配的内存(或为空指针)时才定义。这些例程一起工作以保存有关它们提供的分配的信息。因此,当传递指向realloc或free的指针时,您不需要传递已分配内存的长度,因为例程已经拥有该信息。 -
对于awkwardly written, but good basic malloc/realloc introduction 工作,虽然这个 32 位教程(小心你可以将它扩展到处理 64 位)请注意有许多策略来处理内存块,例如使用 using “边界标记”。例如。见Paper by Paul Wilson
-
K&R中有
mallocrealloc和free的示例代码。