01
指针的本质:内存地址与间接访问
理解指针就是地址,*运算符实现间接访问
基础地址
02
指针的声明与初始化:类型匹配的重要性
类型不一致导致解包错误,强类型检查
声明类型安全
03
指针的算术运算:加减法与数组遍历
p+1 移动 sizeof(类型) 字节,边界风险
运算数组
04
指针与数组:数组名退化为指针
arr 与 &arr 的区别,sizeof 陷阱
数组退化
05
指针与函数:传址调用与回调函数
通过指针修改实参,函数指针作为参数
函数回调
06
动态内存分配:malloc、calloc、realloc、free
堆区操作,必须检查返回值与释放
动态内存堆
07
野指针的成因:未初始化、释放后未置空
指向随机地址,崩溃或数据损坏
野指针危险
08
缓冲区溢出:字符串操作的危险边界
gets、sprintf 不检查长度,覆盖相邻内存
溢出字符串
09
栈溢出:递归过深与局部数组过大
栈空间有限,无限递归或超大局部变量
栈递归
10
堆溢出:写入超过分配大小的内存
破坏堆管理结构,导致任意代码执行
堆溢出安全
11
数组越界访问:下标超出范围
arr[10] 访问越界,逻辑错误或崩溃
数组越界
12
字符串越界:strcpy、strcat、sprintf的陷阱
不追加'\0'或长度不足,经典漏洞
字符串危险函数
13
指针类型转换:强制转换与对齐问题
违反 strict aliasing,未对齐访问
转换对齐
14
函数指针越界:调用非法地址
函数指针被篡改,跳转到任意位置
函数指针控制流
15
多级指针:指向指针的指针的越界风险
二级指针解引用越界,间接修改
多级指针间接
16
结构体指针:成员访问与内存对齐
偏移量计算错误,padding 导致越界
结构体对齐
17
链表操作:遍历、插入、删除中的越界
空指针解引用,尾节点处理不当
链表指针
18
内存泄漏:忘记释放动态内存
堆内存持续增长,资源耗尽
泄漏free
19
双重释放:同一块内存释放两次
破坏堆管理,导致崩溃或漏洞
double free崩溃
20
使用未初始化的内存:读取垃圾值
局部变量未赋值,指针指向随机区域
未初始化垃圾值
21
指针与const:常量指针与指针常量
const 位置决定可变性,防止意外修改
const只读
22
void*指针:通用指针的滥用
丢失类型信息,解包错误或越界
void*泛型
23
指针与多维数组:行指针与列指针
int (*p)[N] 与 int *p[N] 区别
多维数组行指针
24
指针与文件操作:文件缓冲区指针
FILE* 内部指针,错误使用导致越界
文件缓冲区
25
线程安全与指针:竞态条件与数据竞争
多线程同时读写指针指向的内存
线程竞态
26
调试工具:GDB、Valgrind、AddressSanitizer
检测越界、泄漏、未初始化
调试工具
27
静态分析工具:PC-lint、Cppcheck、Clang Static Analyzer
编译前发现潜在越界风险
静态分析lint
28
防御性编程:断言、边界检查、安全函数
assert、strncpy_s 等防护手段
防御安全
29
编码规范:MISRA-C、SEI CERT C
工业级规则,禁止危险指针用法
规范标准
30
实战案例:从崩溃到修复的完整过程
真实bug定位、分析、修补与反思
实战案例