从K& R书中解释这种免费实施

时间:2014-09-22 04:14:40

标签: c

这是K&amp; R书中malloc / free实现的摘录。我很难理解自由函数,尤其是for循环中的if语句:if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))。如果p >= p->s.ptr为真,那么p必须是空闲列表中的最后一个节点,因为它是一个循环列表,现在p->s.ptr必须指向基本标题(记住它是一个定义的列表标题{{ 1}})。那么static Header base;怎么可能是真的呢?有人可以解释一下吗?

bp < p->s.ptr

1 个答案:

答案 0 :(得分:0)

第一个循环试图在即将被释放的块之前找到空闲块。它只遍历已释放的块,而不是所有块。

有两种情况需要考虑。下一个空闲块来自当前空闲块(通常情况下),或者下一个块回绕到开头。

如果下一个空闲块在当前空闲块之后,那么我们需要检查我们正在释放的块是否在当前块和下一个块之间。但是,如果下一个空闲块包围,那么由于列表的循环性质,我们必须看看我们正在释放的块是在当前块之后还是在下一个块之前。

请注意,空闲列表是免费块的列表,因此您正在讨论的if正在检查即将释放的块(但不是' t释放了!)在已经>被释放的第一个块之前,这是完全可能的。