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
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