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
|