打印

malloc 函数的实现

[复制链接]
257|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
你说说说说|  楼主 | 2018-9-30 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
malloc 函数实现:

在malloc函数中,当申请空间时,至少要分配;两个header元素节点。??????因为每个空间块都包含两部分:空间头和空间体。空间头是为维护而设计的,说到底就是维护已用的空间链表,为搜索空闲空间和释放已用空间服务。空间体是供用户读写的,当malloc函数返回用户一个指针时,用户就可以设定自己的规格,比如强制转换成int型或double类型,接下来就可以按照这种规格进行读写了。需要注意一点,空间头是不能被用户访问的,它是用来维护堆的,不是为用户服务的,所以malloc函数返回的指针是指向空间体的,而不是指向空间头的,理所当然free函数得到的指针也是指向空间体的,可是为了释放空间,free函数需要得到该空间的空间头的信息,所以实现时需要把指针调整一下,改为指向空间头。另外,空间头和空间体同为Header类型,用union声明再合适不过







下面就是malloc函数和free函数的实现代码:

#define NULL 0#define MEMSEZE8096typedef doubleAlign;typedef unionheader{        struct{               unionheader* next;               unsignedusedsize;               unsignedfreesize;               }s;        Aligna;}header;static Headermem[MEMSIZE];static Header*memptr=NULL;void*malloc(unsigned nbytes){      Header*p,*newp;      unsignednunits;      nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1;      if(memptr==NULL)      {         memptr->s.next=memptr=mem;         memptr->s.usedsize=1;         memptr->s.freesize=MEMSIZE-1;      }      for(p=memptr;(p->s.next!=memptr)&& (p->s.freesize<nunits);p=p->s.next);      if(p->freesize<nunits)return NULL;      newp=p+p->s.usedsize;      newp->s.usedsize=nunits;      newp->s.freesize=p->s.freesize-nunits;      newp->s.next=p->s.next;      p->s.freesize=0;      p->s.next=newp;      memptr=newp;      return(void*)(newp+1);}void free(void*ap){     Header*bp,*p,*prev;     bp=(Header*)ap-1;     for(prev=memptr,p=memptr->s.next;     (p!=bp)&& (p!=memptr);prev=p,p=p->next);     if(p!=bp)return;     prev->s.freesize+=p->s.usedsize+p->s.freesize;     prev->s.next=p->s.next;     memptr=prev;}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

355

主题

355

帖子

1

粉丝