📄 mm_0.c
字号:
{ 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; } 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))); void *result; 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)); 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 + -