段错误(segmentation fault)

segmentation fault段错误
segmentation fault段错误往往是由于访问了一个不可存取的内存地址,或者是试图以一种不可不允许的方式访问某块内存(如写入一块只读内存等)。segmentation是个历史名词,是由内存的段式管理和页式管理而来。
不同os对段错误触发的信号可能不一致,在类unix系统中,信号是SIGSEGV ,此信号被发送到触发段错误的进程。
引起段错误的原因有以下几类:
1)存取空指针
2)试图访问进程没有权限访问的内存(如在进程空间中访问内核结构)
3)试图访问一个不存在的内存地址(在进程内存空间之外)
4)试图写入只读内存(如代码段)
5)缓冲区溢出
6)使用未初始化的指针
例子1:


    char *p1 = NULL;           // Initialized to null, which is OK,
                               // (but cannot be dereferenced on many systems).
    char *p2;                  // Not initialized at all.
    char *p3  = new char[20];  // Great! It's allocated,
    delete [] p3;              // but now it isn't anymore.
现在试图存取上述任何指针变量,都会引起段错误
例子2:
 int main(void)
 {
     char *s = "hello world";
     *s = 'H';
 }
 试图写入只读内存,char *s = "hello world"在代码段
 例子3:
  int *ptr = NULL;
 *ptr = 1;
 对空指针的访问会引起段错误
 例子4:
   int main(void)
 {
    main();
    return 0;
 }
 栈溢出引起段错误。这与语言有关,部分实现了尾递归的语言,可以避免这种现象。尾递归中,在生成可执行程序时,会转化成迭代的计算过程。
 
原文地址:http://en.wikipedia.org/wiki/Segmentation_fault
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值