看板 C_and_CPP 關於我們 聯絡資訊
如題 The C Programming Language的最後有一段關於簡單的malloc()&free()的實作 但其中的free()有段程式碼一直看不明白 看了許多人寫的超詳細的筆記,但無奈一直參悟不了 所以想請板上大大幫忙解讀一下m(_ _)m http://freeport9.blog.163.com/blog/static/26050569200722104655122/ (簡體網站) void free(void *ap) { Header *bp, *p; bp = (Header *)ap - 1; /* point to block header */ for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* freed block at start or end of arena */ if (bp + bp->size == p->s.ptr) { /* join to upper nbr */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; } else bp->s.ptr = p->s.ptr; if (p + p->size == bp) { /* join to lower nbr */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; } else p->s.ptr = bp; freep = p; } 其中的 for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* freed block at start or end of arena */ 這段程式碼應該是在list中尋找適合把記憶體區塊放進去的地方 但我看不懂其中奧秘 用GDB來看也不知道為什麼要這樣比較,以及這樣比較的用意 請各位大大幫解惑,謝謝m(_ _)m p.s. 超詳盡的筆記 https://paper.dropbox.com/doc/Lab-42-Mini-ARM-OS-LRpCaS35Pv7GNEWn0Zarq -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 120.109.130.197 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1539074330.A.A63.html ※ 編輯: wei115 (120.109.130.197), 10/09/2018 16:49:25
longlongint: 介於兩者之間插進去 10/09 23:39
longlongint: 特例 起點終點 10/09 23:39
longlongint: 插入時若連續就合併 10/09 23:43