第1章
内存的“江湖”
为什么需要动态内存分配?栈与堆的恩怨情仇。
⚡ 基础🧠 概念
第2章
malloc 的魔法
malloc函数原型、参数与返回值、申请一块整型内存。
🔧 函数📦 分配
第3章
calloc 的妙用
calloc函数原型、与malloc的区别、初始化内存块。
🧹 清零📐 数组
第4章
realloc 的伸缩术
realloc函数原型、调整内存大小、注意事项与陷阱。
🔄 调整⚠️ 陷阱
第5章
free 的使命
free函数原型、释放内存、避免野指针。
🗑️ 释放🛡️ 安全
第6章
内存泄漏的“幽灵”
什么是内存泄漏、泄漏的后果、常见泄漏场景。
👻 泄漏🔍 检测
第7章
悬空指针的“陷阱”
什么是悬空指针、产生原因、如何避免。
⚠️ 悬空🧼 避免
第8章
动态数组的实现
用malloc创建动态数组、访问与修改元素。
📊 数组💡 实践
第9章
动态字符串的处理
用malloc处理字符串、strdup函数的实现。
🔤 字符串📝 复制
第10章
结构体的动态分配
为结构体变量分配内存、结构体指针的使用。
🏗️ 结构体📌 指针
第11章
结构体数组的动态分配
为结构体数组分配内存、遍历与操作。
📋 数组🔁 遍历
第12章
二级指针与动态二维数组
用指针数组模拟二维数组、用数组指针模拟二维数组。
🧩 二维🔗 指针
第13章
柔性数组
C99特性、结构体中的柔性数组、内存布局与优势。
✨ C99📐 布局
第14章
内存对齐
什么是内存对齐、对齐规则、为什么要对齐。
📏 对齐⚙️ 性能
第15章
内存池的初步设计
为什么需要内存池、简单的固定大小内存池实现。
🏊 池🧱 固定
第16章
常见内存错误
越界访问、重复释放、释放非堆内存。
🚫 错误🐛 调试
第17章
调试内存问题
使用Valgrind检测内存泄漏、使用AddressSanitizer。
🛠️ Valgrind🧪 ASan
第18章
void* 的妙用
通用指针、函数指针与回调、实现泛型数据结构。
🧬 泛型🔁 回调
第19章
动态链表
单向链表的创建、插入、删除与销毁。
🔗 链表📝 操作
第20章
动态栈
用动态数组实现栈、压栈与出栈操作。
📚 栈⬆️ LIFO
第21章
动态队列
用动态数组实现循环队列、入队与出队操作。
🚶 队列🔄 循环
第22章
动态哈希表
简单哈希表的设计、动态扩容与缩容。
🗂️ 哈希📈 扩容
第23章
动态数组的扩容策略
倍数扩容与线性扩容、性能分析。
📊 策略⚡ 性能
第24章
引用计数
什么是引用计数、手动实现一个简单的引用计数。
🔢 计数🧹 自动
第25章
RAII思想在C中的模拟
资源获取即初始化、使用goto cleanup模式。
🛡️ RAII🧹 cleanup
第26章
setjmp/longjmp与内存管理
非局部跳转、清理资源的挑战。
🏃 跳转⚠️ 资源
第27章
线程安全的内存分配
多线程环境下的malloc、线程局部存储。
🧵 线程🔒 安全
第28章
自定义分配器
实现一个简单的基于mmap的分配器。
⚙️ mmap🛠️ 分配器
第29章
内存碎片
内部碎片与外部碎片、如何减少碎片。
🧩 碎片📉 优化
第30章
综合实战:动态数组库 (Vector)
包含初始化、插入、删除、扩容、销毁。
🏁 实战📦 Vector