请问什么是Segmentation Fault错误?
我在Linux下用C编了一个程序,编译连接都没错,但一运行就出现
Segmenttion Fault错误,并且终止运行。请问怎么会出现这种错误?
问题点数:100、回复次数:5Top
1 楼TripleX(最爱小招)回复于 2003-06-01 20:00:05 得分 50
访问了非法的内存地址,也叫越界访问。比如
char *p;
p = (char *)malloc(10);
p[15] = 'c';
访问到了没有分配的地址,不过一般这么近的越界不一定会引发SIGSEG,
你可以编译时加上-g选项,然后用gdb跟一下看看什么地方指针不对了。Top
2 楼CoolQ()回复于 2003-06-02 01:50:38 得分 50
原因很多,大部分原因是由于访问了无法访问的地址,或者是岂图求该只读型的内存而产生的错误。
举例如下:
第一个例子:
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,但是不是正确的程序Top
3 楼chatboy218(小宁)回复于 2003-06-02 07:29:44 得分 0
我也同意楼上的看法Top
4 楼ph4nt0m(aXis)回复于 2003-06-02 13:33:17 得分 0
缓冲区溢出同样会造成segmentation fault,就是像楼上说的:由于访问了无法访问的地址,或者是岂图求该只读型的内存而产生的错误。
比如
char buf[10];
strcpy(buf,argv[1]);
当argv[1]超过10的时候会溢出,造成segmentation fault
当然由于gcc可能会填充一些字节,所以可能需要更多字节才能造成溢出。Top
5 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2003-06-02 13:38:57 得分 0
内存非法访问出现的,包括一些系统调用中使用的资源(互斥量、信号量)没有初始化或者被释放Top




