📄 malloc.c
字号:
#include <unistd.h>#include "Malloc.h"static Header base;static Header *free_list=NULL;void *Malloc(unsigned int nbytes){ Header *p,*prev; unsigned int nunits; nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1; if((prev=free_list)==NULL){ base.s.next=free_list=prev=&base; base.s.size=0; } for (p=prev->s.next;;prev=p,p=p->s.next){ if(p->s.size>=nunits){ if(p->s.size==nunits) prev->s.next=p->s.next; else{ p->s.size-=nunits; p+=p->s.size; p->s.size=nunits; } free_list=prev; return(void*)(p+1); } if(p==free_list) if((p=morecore(nunits))==NULL) return NULL; }}static Header *morecore(unsigned int nu){ char *cp; Header *up; if (nu<NALLOC) nu=NALLOC; cp=sbrk(nu * sizeof(Header)); printf("sbrk:%x--%x\n",cp,cp+nu * sizeof(Header)); if(cp==(char*)-1) return NULL; up=(Header *)cp; up->s.size=nu; Free(up+1); return free_list;}void Free(void *ap){ Header *bp,*p; bp=(Header *)ap-1; for (p=free_list; !(bp>p && bp<p->s.next);p=p->s.next) if (p>=p->s.next && (bp>p || bp<p->s.next)) break; if(bp+bp->s.size==p->s.next){ bp->s.size+=p->s.next->s.size; bp->s.next=p->s.next->s.next; } else bp->s.next=p->s.next; if(p+p->s.size==bp){ p->s.size+=bp->s.size; p->s.next=bp->s.next; } else p->s.next=bp; free_list=p;}void print_list(void){ Header * p; int i=0; printf("base:%x,base.nest:%x,base.next.next:%x,free:%x\n",&base, base.s.next,base.s.next->s.next,free_list); for(p=&base;p->s.next !=free_list;p=p->s.next){ i++; printf("block %d,size=%d",i,p->s.size); if(p>free_list) printf("It is not searched afrer this point.\n"); else printf("It is a searched free block!\n"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -