什么是segmentation fault?

Segmentation fault这种错误,通常是由于访问了"不属于你"的内存引起的。这种帮助机制防止你把内存搞得一团糟以及引入难以调试的Bugs。每当你看到segfault提示的时候,你应该知道你错误的访问了内存——比如访问已经释放的变量,写数据到内存的只读部分,等等。在大多数可能搞乱内存的语言中,segfault基本是一样的,在C和C++中没有什么大不同。


至少在C(++)这种底层语言中,有多种方法可以导致segfault的提示。

① 一种常见的导致提示segfault方法是访问空指针指向内存的值。

int *p = NULL;
*p = 1;

② 另一种提示segfault的情况是,你向只读内存中写数据。

char *str = "Foo";  // 编译器认为常量字符串是只读的
*str = 'b';         // 所以这行语句非法,从而提示segfault

③ 以及悬垂指针指向一个不再存在的变量,如下所示:

char *p = NULL;
{
    char c;
    p = &c;
}
// 现在p是悬垂的了
p变成了悬垂指针,因为它指向了一个花括号之外就不存在的变量c。而且当你给这个悬垂指针指向的内存赋值(如 *p='A')时,你很可能得到一个segfault的提示。




原文:http://stackoverflow.com/questions/2346806/what-is-segmentation-fault
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值