存储分配
typedef long Align;/* for alignment to long boundary */union header {struct {union header *ptr;/* next block if on free list */unsigned int size;/* size of this block */} s;Align x;/* force alignment of blocks */};typedef union header Header;static Header base;/* empty list to get started */static Header *freep = NULL;/* start of free list */void *malloc(unsigned int nbytes){Header *p, *prevp;Header *morecore(unsigned int);unsigned int nunits;nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;if ((prevp = freep) == NULL) {/* no free list yet */base.s.ptr = freep = prevp = &base;base.s.size = 0;}for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) {if (p->s.size >= nunits) {if (p->s.size == nunits) {prevp->s.ptr = p->s.ptr;} else {p->s.size -= nunits;p += p->s.size;p->s.size = nunits;}freep = prevp;return (void *)(p+1);}if (p == freep)/* wrapped around free list */if ((p = morecore(nunits)) == NULL)return NULL;}}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;if (bp + bp->s.size == p->s.ptr) {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->s.size == bp) {p->s.size += bp->s.size;p->s.ptr = bp->s.ptr;} else {p->s.ptr = bp;}freep = p;}// morecore用于向OS请求存储空间#define NALLOC 1024/*minimum units to request */static Header *morecore(unsigned int nu){char *cp, *sbrk(int);Header *up;if (nu < NALLOC)nu = NALLOC;cp = sbrk(nu * sizeof(Header));if (cp == (char *)-1)/* no space */return NULL;up = (Header *)cp;up->s.size = nu;free(up+1);return freep;}