1. 什么是Segmentation Fault?
当你在编写C语言程序时,突然遇到程序崩溃并显示"Segmentation fault (core dumped)"的错误信息,这可能是每个C程序员都经历过的噩梦时刻。这种错误通常简称为"段错误",是操作系统对程序非法内存访问的一种保护机制。
段错误的核心本质是程序试图访问未被分配给它的内存区域,或者以错误的方式访问已分配的内存。想象一下,你未经允许就闯入别人的私人领地,保安(操作系统)会立即阻止你——这就是段错误的基本原理。
在Linux系统中,当发生段错误时,内核会向进程发送SIGSEGV信号(信号编号11)。默认情况下,这个信号会导致进程终止并生成核心转储文件(core dump),其中包含了程序崩溃时的内存状态信息。
提示:在开发环境中,可以通过
ulimit -c unlimited命令启用core dump文件生成,这对调试段错误非常有帮助。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 段错误的常见原因及实例分析
2.1 空指针解引用
这是最常见的段错误原因之一。当你尝试通过一个NULL指针访问内存时,系统会立即触发段错误。
c复制int *ptr = NULL;
*ptr = 10; // 这里会引发段错误
在实际项目中,空指针解引用经常发生在:
- 忘记检查malloc/calloc的返回值
- 函数返回NULL但调用方未做检查
- 结构体指针未初始化就使用
2.2 数组越界访问
C语言不会自动检查数组边界,越界访问可能导致段错误或更隐蔽的内存破坏。
c复制int arr[5];
arr[5] = 10; // 越界访问,可能引发段错误
更危险的是,有时越界访问不会立即导致崩溃,而是破坏其他内存区域,这种问题更难调试。
2.3 访问已释放的内存
使用free释放内存后继续访问该内存区域是典型的"use-after-free"错误。
c复制int *ptr = malloc(sizeof(int));
free(ptr);
*ptr = 20; // 已释放的内存,段错误
2.4 栈溢出
递归调用过深或局部变量过大可能导致栈空间耗尽。
c复制void infinite_recursion() {
in
