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

📄 mm___2.c

📁 ICS 课程的Lab7
💻 C
📖 第 1 页 / 共 2 页
字号:
                    }                    return pre;                                    }                else                {                     newptr=mm_malloc(size);                     memcpy(newptr,oldptr,oldsize-DSIZE);                     mm_free(oldptr);                     return newptr;                                    }                                                            }                                                                                }            }                  }void *mm_malloc(size_t size){    size_t asize;    size_t extendsize;    void  *bp;        j++;            if(size<=0)    {        return NULL;    }    if(size <= DSIZE)    {        asize = DSIZE + OVERHEAD;            }else    {        asize = DSIZE *((size +(OVERHEAD) + (DSIZE - 1))/DSIZE);    }    if((bp = find_fit(asize)) !=NULL)    {                return place(bp,asize);    }    extendsize = MAX(asize,CHUNKSIZE);    if((bp = extend_heap(extendsize/WSIZE)) == NULL)    {        return NULL;    }   return  place(bp,asize);    }static void *coalesce(void *bp){    size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));    size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));    size_t size       = GET_SIZE(HDRP(bp));    void *temp1;    void *temp2;               if(prev_alloc && next_alloc)    {     	if(header==NULL)    	{	       PUT(bp,(int)NULL);	       PUT(NEXT(bp),(int)NULL);	       tail=header=bp;    	}	else	{	    if(bp<header)	    {            PUT(bp,(int)NULL);            PUT(NEXT(bp),(int)header);            PUT(header,(int)bp);            header=bp;			    }        	    for(temp1=header;temp1!=NULL;temp1=(void *)(GET(NEXT(temp1))))	    {             		temp2=(void *)(GET(NEXT(temp1)));		if(temp2!=NULL)		{		    if(bp>temp1 &&bp<temp2)		    {			PUT(NEXT(temp1),(int)(bp));			PUT(bp,(int)temp1);						PUT(NEXT(bp),(int)temp2);			PUT(temp2,(int)bp);			return bp;		    }		}		else		{		    if(bp>temp1)		    {                        PUT(NEXT(temp1),(int)bp);                        PUT(bp,(int)temp1);                        PUT(NEXT(bp),(int)NULL);                        tail=bp;		    }                  }	    }        	    	}        return bp;    }    else if(prev_alloc && !next_alloc)    {    	void *nextBp=NEXT_BLKP(bp);             size += GET_SIZE(HDRP(NEXT_BLKP(bp)));        PUT(HDRP(bp),PACK(size,0));        PUT(FTRP(bp),PACK(size,0));	        temp1=(void *)(GET(nextBp));        temp2=(void *)(GET(NEXT(nextBp)));       	        PUT(nextBp,(int)NULL);        PUT(NEXT(nextBp),(int)NULL);		if(temp1==NULL && temp2==NULL)	{ 	    PUT(bp,(int)NULL);	    PUT(NEXT(bp),(int)NULL);	    tail=header=bp;	    	}else if(temp1!=NULL && temp2==NULL)        {	    PUT(NEXT(temp1),(int)bp);	    PUT(bp,(int)temp1);	    PUT(NEXT(bp),(int)NULL);        tail=bp;	    	}else if(temp1==NULL && temp2!=NULL)	  {	 	    PUT(NEXT(bp),(int)temp2);	    PUT(temp2,(int)bp);	    PUT(bp,(int)NULL);	    	    header=bp;	    	}else	{	   	     PUT(NEXT(temp1),(int)bp);	     PUT(bp,(int)temp1);             PUT(temp2,(int)bp);	     PUT(NEXT(bp),(int)temp2);	  	    	}	              return bp;    }    else if(!prev_alloc && next_alloc)    {        size += GET_SIZE(HDRP(PREV_BLKP(bp)));        PUT(FTRP(bp),PACK(size,0));        PUT(HDRP(PREV_BLKP(bp)),PACK(size,0));        return PREV_BLKP(bp);            }else    {                   void *pre=PREV_BLKP(bp);            void *next=NEXT_BLKP(bp);            void *next1=(void *)(GET(NEXT(next)));            PUT(next,(int)NULL);	        PUT(NEXT(next),(int)NULL);	         size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp)));        PUT(HDRP(PREV_BLKP(bp)),PACK(size,0));        PUT(FTRP(NEXT_BLKP(bp)),PACK(size,0));               if(next1==NULL)	{	    PUT(NEXT(pre),(int)NULL);            tail=pre;	}	else	{	    PUT(NEXT(pre),(int)next1);	    PUT(next1,(int)pre);	    	}	return pre;            }                    }static void *find_fit(size_t asize){    void *bp;    if(header==NULL)    {    	return NULL;    }    int *current=(int *)numberheader;    int i;    int max=0;                   if(j%2==1)    {                                   for(bp=header;bp!=NULL;bp=(void *)(GET(NEXT(bp))))      {    	if(asize<=GET_SIZE(HDRP(bp)))    	{	                 return bp;    	}          }                    }else    {        if(tail==NULL)        {            return NULL;                    }                       for(bp=tail;bp!=NULL;bp=(void *)(GET(bp)))      {    	if(asize<=GET_SIZE(HDRP(bp)))    	{	                 return bp;    	}              }           }                                                                      return NULL;        }static void *place(void *bp,size_t asize){    size_t csize = GET_SIZE(HDRP(bp));        void *pre=(void *)(GET(bp));    void *next=(void *)(GET(NEXT(bp)));    if((csize - asize) >= (DSIZE + OVERHEAD))    {             	if(j%2==1)    {	    		 PUT(bp,(int)NULL);	 PUT(NEXT(bp),(int)NULL);	     	 PUT(HDRP(bp),PACK(asize,1));     PUT(FTRP(bp),PACK(asize,1));    void *result=bp;     bp=NEXT_BLKP(bp);     PUT(HDRP(bp),PACK(csize - asize ,0));     PUT(FTRP(bp),PACK(csize - asize ,0));  		  if(pre==NULL && next==NULL)	{	         PUT(bp,(int)NULL);           	PUT(NEXT(bp),(int)NULL);	        tail=header=bp;	    	 }else if(pre!=NULL && next==NULL)	 {	  	         PUT(NEXT(pre),(int)bp);	         PUT(bp,(int)pre);         	PUT(NEXT(bp),(int)NULL);	        tail=bp;	    	    	}	else if(pre==NULL && next!=NULL)		{	    	 PUT(bp,(int)NULL);	 PUT(NEXT(bp),(int)next);	 PUT(next,(int)bp);	 header=bp;	    	}else	{	 PUT(NEXT(pre),(int)bp);         PUT(bp,(int)pre);	    	 PUT(NEXT(bp),(int)next);	 PUT(next,(int)bp);	    	}      return result;		}		else        		{            PUT(HDRP(bp),PACK(csize-asize,0));        	PUT(FTRP(bp),PACK(csize-asize,0));        	bp=NEXT_BLKP(bp);        	PUT(HDRP(bp),PACK(asize ,1));         	PUT(FTRP(bp),PACK(asize ,1));            		}                       	 }	 else	{        	    PUT(HDRP(bp),PACK(csize,1));    	PUT(FTRP(bp),PACK(csize,1));	        if(pre==NULL && next==NULL)	{	    tail=header=NULL;	    	}else if(pre==NULL && next!=NULL)	{	    PUT(next, (int)NULL);	    header=next;	    	}else if(pre!=NULL && next==NULL)	{	    	    PUT(NEXT(pre),(int)NULL);        tail=pre;	}else	{	    PUT(NEXT(pre),(int)next);	    PUT(next,(int)pre);	}    }                     return bp;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -