malloc.c

来自「内 存 的 申 请 与 释 放 简单的程序」· C语言 代码 · 共 81 行

C
81
字号
#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 + =
减小字号Ctrl + -
显示快捷键?