gcc编译出现segmentation fault的错误

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
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lm_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值