参考:https://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html
段错误的定义
段错误是指程序尝试访问一段不可访问的内存。
常见段错误产生原因
产生段错误的原因主要有:
- 解引用空指针
- 访问不可访问的内存空间(如内核空间)
- 访问不存在的内存地址
- 试图写一个只读内存空间(如代码段)
- 栈溢出(函数递归调用)
- 使用未初始化的指针(定义时没有初始化或者已经回收)
1. 访问不存在的内存地址;
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr = NULL;
*ptr = 0;
}
2. 访问系统保护的内存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr = (int *)0;
*ptr = 100;
}
3. 访问只读的内存地址;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *ptr = "test";
strcpy(ptr, "TEST");
}
4.栈溢出
#include<stdio.h>
#include<stdlib.h>
void main()
{
main();
}
段错误信息的获取
几种查看段错误的发生信息的途径:
1 .dmesg
dmesg可以在应用程序crash掉时,显示内核中保存的相关信息。通过dmesg命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。
2 .-g
使用gcc编译程序的源码时,加上-g参数,这样可以使得生成的二进制文件中加入可以用于gdb调试的有用信息。
例:gcc -g -o test_dmesg test_dmesg.c
预防发生段错误注意事项
- 出现段错误时,首先应该想到段错误的定义,从它出发考虑引发错误的原因
- 在使用指针时,定义了指针后记得初始化指针,在使用的时候记得判断是否为NULL
- 在使用数组时,注意数组是否被初始化,数组下标是否越界,数组元素是否存在等
- 在访问变量时,注意变量所占地址空间是否已经被程序释放掉
- 在处理变量时,注意变量的格式控制是否合理等