如题
The C Programming Language的最后有一段关于简单的malloc()&free()的实作
但其中的free()有段程式码一直看不明白
看了许多人写的超详细的笔记,但无奈一直参悟不了
所以想请板上大大帮忙解读一下m(_ _)m
http://freeport9.blog.163.com/blog/static/26050569200722104655122/
(简体网站)
void free(void *ap)
{
Header *bp, *p;
bp = (Header *)ap - 1; /* point to block header */
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
break; /* freed block at start or end of arena */
if (bp + bp->size == p->s.ptr) { /* join to upper nbr */
bp->s.size += p->s.ptr->s.size;
bp->s.ptr = p->s.ptr->s.ptr;
} else
bp->s.ptr = p->s.ptr;
if (p + p->size == bp) { /* join to lower nbr */
p->s.size += bp->s.size;
p->s.ptr = bp->s.ptr;
} else
p->s.ptr = bp;
freep = p;
}
其中的
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
break; /* freed block at start or end of arena */
这段程式码应该是在list中寻找适合把内存区块放进去的地方
但我看不懂其中奥秘
用GDB来看也不知道为什么要这样比较,以及这样比较的用意
请各位大大帮解惑,谢谢m(_ _)m
p.s. 超详尽的笔记
https://paper.dropbox.com/doc/Lab-42-Mini-ARM-OS-LRpCaS35Pv7GNEWn0Zarq