首先我们先来搞清楚什么会导致段错误(Segmentation fault
)。段错误是指硬件设备MMU(内存管理单元)
发现访问了一个非法的虚拟地址,通知操作系统内核给进程发送11号信号(SIGSEGV信号
),导致进程异常终止。
一般来说,段错误是由以下几个原因导致的:
- 解引用空指针
- 访问不可访问的内存空间(如内核空间)
- 访问不存在的内存地址
- 试图写一个只读内存空间(如代码段)
- 栈溢出(函数递归调用太深)
- 使用未初始化的指针(定义时没有初始化或者已经回收)
搞清楚缘由后,我们就可以下手来处理了,这里我们以一个空指针引用为例:
#include <stdio.h>
int main(void)