C-C语言malloc函数代码问题

发布于 2017-01-03 05:22:24 字数 1430 浏览 1216 评论 1

#define NALLOC 1024  
#define NULL 0
typedef long Align;

union header {
struct {
union header *ptr;//指向下一块空闲快
unsigned size;//当前空闲块的大小
} s;
Align x;//x主要是保证分配的内存为Align的倍数。涉及到内存对齐
};

typedef union header Header;
static Header base;
static Header *freep=NULL;
static Header *morecore(unsigned);

void *mymalloc(unsigned nbytes) {
Header *p,*prevp;
unsigned nunites;
nunites =(nbytes+sizeof(Header)-1)/sizeof(Header)+1;//分配的内存大小
if((prevp =freep)==NULL){ //no free list yet,the first call malloc
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>=nunites){ //big enough
if(p->s.size==nunites) //exactly
prevp->s.ptr=p->s.ptr;
else{ //allocate tail end总是从每块空闲快的尾部截取
p->s.size-=nunites;
p+=p->s.size;
p->s.size=nunites;
}
freep=prevp;
return (void *)(p+1);
}
if(p==freep){
if((p=morecore(nunites))==NULL)
return NULL;
}
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瑾兮 2017-03-30 19:57:13

base.s.ptr =freep=prevp=&base; 一开始还没空闲的内存,指向自己。如下图:

if(p==freep){
if((p=morecore(nunites))==NULL)
return NULL;
}
空闲的列表已经分配完,不够了再申请一些内存空间。
参考这里:http://www.cevx.com/bbs/thread-17145-1-1.html
有详细的讲解你的上面的代码。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文