# 第 17 章实验:嵌入式空闲链表与真实 malloc 的头块 ## 做什么 - `freelist.c`:按原书 17.2 节在一块 4KB mmap 内存里构建空闲链表(头块 8 字节:size + magic;空闲节点 8 字节:size + next), 首次适配 + 分割,释放插入表头、不自动合并,最后手动合并。为与原书数字一致,next 存"书中地址"(堆起点记为 16384)。 - `glibc_header.c`:观察 glibc malloc 的真实头块:相邻两块相差 112 字节、用户指针前 8 字节的 size 字段 0x71。 ## 怎么跑 ``` make ./freelist ./glibc_header ``` ## 该观察到什么、为什么 - freelist 依次复现图 17.3~17.7:4088 → 3980 → 3764;free(16500) 后 head→16492(100)→16708(3764); 全部释放但不合并时链表有 4 块,malloc(3900) 失败;合并后恢复成一块 4088,malloc(3900) 成功。 - glibc:malloc(100) 实际占 112 字节(头 + 对齐),free 后立刻再 malloc 同样大小会拿回同一块。