段错误(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

你可能感兴趣的:(GNU/linux)