这章举例实现了一个内存管理函数malloc 将系统以来的部分和非系统依赖的部分进行分离
malloc内部管理的内存区块实际上是一个环链表,用一个全局指针纪录上一次操作的节点,用户遍历时判断是否已经遍历一周。
每个链表节点又一个头部组成,纪录了下一个区块的地址和整个区块的尺寸
定义如下
typedef long Align;union header{struct {union header * ptr;unsigned size;} s;Align x;
};typedef union header Header;
Align是使得申明出来的区块具有字节对齐属性
接下来是malloc函数的实现
首先需要一个base 节点提供初始化使用
和一个全局指针指向上一次操作的节点
static Header * freep = NULL;
static Header base;
接下来是malloc函数,遍历各个区块如果尺寸大于需要尺寸就进行分割。正好相等就返回改区块
如果遍历一周没有找到合适的尺寸就调用morecore函数像操作系统申请内存(该函数具有系统依赖)
void * malloc(unsigned nbytes)
{Header *p, *prevp;Header *morecore(unsigned);unsigned nunits;nunits = (nbytes