⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 malloc.c

📁 内 存 的 申 请 与 释 放 简单的程序
💻 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 + -