第八章 动态存储管理
8.11
typedef struct {
char *start;
int size;
} fmblock; //空闲块类型
char *Malloc_Fdlf(int n)//遵循最后分配者最先释放规则的内存分配算法
while(Gettop(S,b)&&b.size<n)
Pop(S,b);
Push(T,b); //从栈顶逐个取出空闲块进行比较
if(StackEmpty(S)) return NULL; //没有大小足够的空闲块
Pop(S,b);
b.size-=n;
if(b.size) Push(S,{b.start+n,b.size});//分割空闲块
while(!StackEmpty(T))
Pop(T,a);
Push(S,a);
} //恢复原来次序
return b.start;
}//Malloc_Fdlf
mem_init()//初始化过程
InitStack(S);InitStack(T); //S 和 T 的元素都是 fmblock 类型
Push(S,{MemStart,MemLen}); //一开始,栈中只有一个内存整块
}//main
8.12
void Free_Fdlf(char *addr,int n)//及上一题对应的释放算法
while(Gettop(S,b)&&b.start<addr)
Pop(S,b);
Push(T,b);
} //在按地址排序的栈中找到合适的插入位置
if(Gettop(T,b)&&(b.start+b.size==addr)) //可以及上邻块合并
Pop(T,b);
addr=b.start;n+=b.size;
if(Gettop(S,b)&&(addr+n==b.start)) //可以及下邻块合并
Pop(S,b);
n+=b.size;
Push(S,{addr,n}); //插入到空闲块栈中
while(!StackEmpty(T))
Pop(T,b);
Push(S,b);
} //恢复原来次序
}//Free_Fdlf
8.13