www.pudn.com > 内存管理 胡一刀 .rar > MEMORY.H


//内存管理申明文件 
#ifndef _MEMORY_H_ 
#define _MEMORY_H_ 
#include  
#include  
//全局变量定义 
#define TOTALMEMORY 60000//数组长度 
char memoryarray[TOTALMEMORY]; 
//链,记录空闲区或使用区 
struct list 
{ 
  //char * firstaddress;//空闲区或使用区首地址 
  struct list * pre;//上一块空闲区或使用区指针, 
  //NULL表示此空闲区或使用区为第一块空闲区或使用区 
  unsigned int size;//空闲区或使用区大小 
  struct list * next;//下一块空闲区或使用区指针, 
  //NULL表示此空闲区或使用区为最后一块空闲区或使用区 
 
}; 
 
struct memory 
{ 
   char *memorybase; //内存区首地址  
   long memorysize;//内存区大小 
   struct list * myalloclist;//使用链 
   struct list * myfreelist;//自由链 
}; 
struct memory mymemory; 
char *myalloc(unsigned int size); 
void  myfree(char*p); 
char * myalloc(unsigned int size) 
{ 
 struct list *tmplist;  
 struct list *tmplist2; 
 struct list *tmplist3; 
 tmplist2 = mymemory.myfreelist;//初始化tmplist2 
 tmplist3 = mymemory.myfreelist;//初始化tmplist3 
 for(tmplist = mymemory.myfreelist;tmplist!=NULL;tmplist = tmplist->next) 
 { 
          if (size<=(tmplist->size)) //最先适应法,找到就给它 
          {   if(size<=(tmplist->size-sizeof(struct list)))//一分为二 
              {  
                 tmplist2 = tmplist; 
			     tmplist =(struct list*) (tmplist+size+sizeof(struct list)); 
				 tmplist->size = tmplist2->size-size-sizeof(struct list); 
				 tmplist->next = tmplist2->next; 
                 tmplist->pre = tmplist2->pre; 
				 if(tmplist2->pre!=NULL)(tmplist2->pre)->next = tmplist; 
				 else mymemory.myfreelist = tmplist; 
				 tmplist2->size = size; 
				 printf("分到%d块内存,余下的可以划分为一块!\n",size); 
              } 
	      else//不能分了 
		  {     if(tmplist->size==size) printf("刚好分到%d块内存!\n",size); 
		        else printf("分到%d块内存,余下的不能划分为一块!\n",size); 
                tmplist2 = tmplist; 
                tmplist3 = tmplist->pre; 
				tmplist = tmplist->next; 
				if(tmplist!=NULL) tmplist->pre = tmplist3; 
                if(tmplist3!=NULL) tmplist3->next = tmplist; 
				else mymemory.myfreelist = tmplist; 
              } 
               
              // 加入 mymemory.myalloclist,直接放到头就可以 
			  tmplist3 = mymemory.myalloclist; 
              mymemory.myalloclist = tmplist2; 
			  mymemory.myalloclist->pre = NULL; 
			  mymemory.myalloclist->next = tmplist3; 
			  if(tmplist3!=NULL) tmplist3->pre = mymemory.myalloclist; 
              return (char*) (tmplist2 + sizeof(struct list)); 
          } 
 } 
 printf("内存不够,没有分到%d块内存!\n",size); 
 return NULL; 
} 
 
void myfree(char*p) 
{   int mark1 = 0; 
    int mark2 = 0,size; 
	struct list *tmplist;  
	struct list *tmplist2; 
    struct list *tmplist3; 
    tmplist2 = mymemory.myfreelist;//初始化tmplist2 
    tmplist3 = mymemory.myfreelist;//初始化tmplist3  
    // 首先在 mymemory.myalloclist 中去除 
	if(p==NULL) printf("此变量内存已经释放了,不要再释放!\n"); 
	else{ 
	for(tmplist = mymemory.myalloclist;tmplist!=NULL;tmplist = tmplist->next) 
	{ 
	  if(p==(char *)(tmplist+sizeof(struct list)))//在 mymemory.myalloclist找到了 
      { 
		   
	    tmplist2 = tmplist; 
		size = tmplist->size; 
		if(tmplist->pre==NULL&&tmplist->next==NULL){mark1=1;mymemory.myalloclist=NULL;break;} 
		else if(tmplist->pre==NULL&&tmplist->next!=NULL){mymemory.myalloclist = (mymemory.myalloclist)->next;(mymemory.myalloclist)->pre =NULL;mark1 = 1;break;} 
		else if(tmplist->pre!=NULL&&tmplist->next==NULL){(tmplist->pre)->next=NULL;mark1 = 1;break;} 
		else 
		{ 
		  tmplist3 = tmplist->pre; 
		  tmplist = tmplist->next;  
          if(tmplist!=NULL) tmplist->pre = tmplist3; 
		  if(tmplist3!=NULL)tmplist3->next = tmplist; 
		  mark1 = 1;break; 
        }  
	  } 
	} 
	if(mark1!=1) {printf("严重错误:不是我们给的内存不能释放!\n");} 
	else{ 
	mark1 = 0; 
      // 然后放入 mymemory.myfreelist 
	if(mymemory.myfreelist==NULL) mymemory.myfreelist = tmplist2; 
	else{ 
    for(tmplist = mymemory.myfreelist;tmplist!=NULL;tmplist = tmplist->next) 
	{ 
	   if(tmplist2pre; 
		 if(tmplist3!=NULL)tmplist3->next = tmplist2; 
		 else mymemory.myfreelist = tmplist2; 
		 tmplist2->pre = tmplist3; 
		 tmplist2->next = tmplist; 
		 tmplist->pre = tmplist2; 
		 break; 
	   } 
	} 
	} 
      // 再检查相临的是否需要合并 
	//先检查和前面的是否能合并 
    if(tmplist3!=NULL) 
	{ 
		if((tmplist3+tmplist3->size+sizeof(struct list))==tmplist2) 
		{ 
		  //合并 
			tmplist3->size = tmplist3->size+tmplist2->size+sizeof(struct list); 
			tmplist3->next = tmplist; 
			tmplist->pre = tmplist3; 
			tmplist2 = tmplist3; 
			mark1 = 1; 
		} 
	}  
	//再检查跟后面的是否能合并 
	if(tmplist2->next!=NULL) 
	{ 
		if((tmplist2+tmplist2->size+sizeof(struct list))==tmplist) 
		{ 
            //合并 
			tmplist2->size = tmplist2->size+sizeof(struct list)+tmplist->size; 
			tmplist2->next = tmplist->next; 
			if(tmplist->next!=NULL)(tmplist->next)->pre = tmplist2; 
			mark2 = 1; 
		} 
	} 
	if(mark1==0&&mark2==0) printf("释放%d块内存成功,没有合并\n",size); 
    else if(mark1==0&&mark2==1) printf("释放%d块内存成功,释放块和他后面块合并\n",size); 
 
	else if(mark1==1&&mark2==0) printf("释放%d块内存成功,释放块和他前面块合并\n",size); 
	else printf("释放%d块内存成功,释放块和他前,后面块合并\n",size); 
	} 
	} 
} 
 
#endif