segmentation fault 即段错误,一般都是出现了非法的地址写操作导致的。
常见的有如下几种情况:
1、空指针访问。
如果指针为空(NULL), 那么对空指针的读写操作都会导致segmentation fault。
如
1
2
3
|
char *p = NULL; printf ( "%c" ,*p); //读操作 *p= 'A' ; //写操作。 |
两种操作任意一种都会导致segmentation fault。
2、指针指向非法区域后的写操作。
C语言的指针指向了非法区域,然后对其写入,会带来不可预知后果,最严重的就是程序崩溃,此时也是segmentation fault。
比如
1
2
3
|
char *p = malloc (100); //申请100字节空间 p+=1000; //超出申请范围。 *p= 'a' ; //此时就有可能出现segmentation fault |
或者
1
2
3
|
char *p = malloc (100); //申请内存 free (p); //释放 *p = 'a' ; //此时p指向空间已经释放,有可能被系统用作其它功能,对其赋值就可能出现segmentation fault。 |
3、常量空间破坏。
比如常量字符串,如果修改其内容,则会出现segmentation fault。
如
1
2
|
char *p = "abcdef" ; //p指向常量字符串。 p[1] = 'M' ; //修改常量空间,导致segmentation fault |
4、在一些比较老的操作系统上,非对齐访问也可能导致segmentation fault。
比如
1
2
3
4
|
int a[2]; char *p1 = ( char *)a; //指向数组首地址。 int *p2 = ( int *)(p1+1); //实际上将a[0]和a[1]的各一部分,组成了一个新的int。 这时对p2的访问,包括读写,都属于非对齐访问。 *p2=3; //此时有可能出现segmentation fault |