当前位置: 技术问答>linux和unix
请问什么是Segmentation Fault错误?
来源: 互联网 发布时间:2015-03-12
本文导语: 我在Linux下用C编了一个程序,编译连接都没错,但一运行就出现 Segmenttion Fault错误,并且终止运行。请问怎么会出现这种错误? | 访问了非法的内存地址,也叫越界访问。比如 char *p; p = (ch...
我在Linux下用C编了一个程序,编译连接都没错,但一运行就出现
Segmenttion Fault错误,并且终止运行。请问怎么会出现这种错误?
Segmenttion Fault错误,并且终止运行。请问怎么会出现这种错误?
|
访问了非法的内存地址,也叫越界访问。比如
char *p;
p = (char *)malloc(10);
p[15] = 'c';
访问到了没有分配的地址,不过一般这么近的越界不一定会引发SIGSEG,
你可以编译时加上-g选项,然后用gdb跟一下看看什么地方指针不对了。
char *p;
p = (char *)malloc(10);
p[15] = 'c';
访问到了没有分配的地址,不过一般这么近的越界不一定会引发SIGSEG,
你可以编译时加上-g选项,然后用gdb跟一下看看什么地方指针不对了。
|
原因很多,大部分原因是由于访问了无法访问的地址,或者是岂图求该只读型的内存而产生的错误。
举例如下:
第一个例子:
main()
{
int *p;
p = (int *)&p + 2;// p现在指向main的返回地址
*p = 0x40000000;将main的返回地址修改成0x40000000,不可访问
}
当这段程序执行以后,main的返回地址变成0x40000000,glibc将试图从0x40000000处继续执行,但是由于内存不可访问而出错。
第二个例子:
main()
{
char *p="Hello";
p[1] = "A"; //p此时为静态指针,所指向的内存为只读,不能修改!
}
这个程序执行后,由于p所指的内存不可写,也会出现segmentation fault.
TripleX(最爱小昭)的例子,运行的时候不一定出现segmentation fault,但是不是正确的程序
举例如下:
第一个例子:
main()
{
int *p;
p = (int *)&p + 2;// p现在指向main的返回地址
*p = 0x40000000;将main的返回地址修改成0x40000000,不可访问
}
当这段程序执行以后,main的返回地址变成0x40000000,glibc将试图从0x40000000处继续执行,但是由于内存不可访问而出错。
第二个例子:
main()
{
char *p="Hello";
p[1] = "A"; //p此时为静态指针,所指向的内存为只读,不能修改!
}
这个程序执行后,由于p所指的内存不可写,也会出现segmentation fault.
TripleX(最爱小昭)的例子,运行的时候不一定出现segmentation fault,但是不是正确的程序