我在我的内存管理器程序中编写了一个查看链表的函数,并测试节点是否在字节上彼此相邻,然后将它们合并为一个。物理上在自由节点旁边的节点当前可能正在保存内存,在这种情况下它不会被合并。我无法弄清楚如何让它工作,我要么得到无限循环或没有合并。
void IfFreeTogether(void)
{
FREEPTR l =freelist;
FREEPTR f = freelist;
FREEPTR g = f->next;
int i = 0;
while(l!=NULL)
{
if(f->start_byte-1 == g->end_byte)
{
g->size = g->size + f-> size;
g->end_byte = f-> end_byte;
g->next = f->next;
l=g->next;
}
if(f->end_byte+1 == g->start_byte)
{
f->size = f->size + g-> size;
f->end_byte = g-> end_byte;
f->next = g->next;
l=f->next;
}
}
}
答案 0 :(得分:1)
在您发布的代码段中,似乎l
是唯一在循环中为其分配新值的var,但f
和g
是唯一正在阅读的内容(尽管如此)事实上,他们只被初始化了一次而且从未改变过。)
这意味着您不会对列表进行任何更改。更糟糕的是 - 由于l
仅由g
或f
分配,您实际上甚至不会将l
提升到任何新的位置,从而导致无限循环(角落除外)您实际设法合并整个列表的情况)