Linux C 段错误
2011-07-28 19:34
113 查看
原文地址:http://tzc.is-programmer.com/posts/252.html
在C语言中出现段错误是很常见的事,多数是由于访问越界或者未分配内存而对其进行赋值操作引起,但是在Linux C中也有另外一种情况可能引起段错误,那就是陷入死循环,这是一个偶然的发现,调试了n个小时之后,终于猜测到的段错误发生原因,测试可以证明: #include<stdio.h>
void print(int a)
{
if(a!=26)
{
printf("%d\n", a);
a++;
}
print(a);
}
int main()
{
print(0);
return 0;
}
进行编译: # > gcc -o main -g --std=c99 main.c运行后结果如下: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
段错误
从上面的例子,可以很容易发现,出现段错误的原因就是陷入死循环。 当然,平时我们不会出现像上面这么明显的弱智错误,这是故意测试用的一个简单例子,但是由于我们做算法时由于考虑不周,很可能出现死循环,从而导致段错误,也就是内存访问冲突问题,那种情况就不会像上面例子那样显而易见了,所以在程序出现段错误时,也要考虑到死循环问题。上述问题的引起原因是堆栈的溢出所导致的,由于每次调用print函数,陷入死循环后,只进栈,不出栈,而栈所分配的空间是有限的,所以到一定程度之后,栈将溢出,导致段错误的发生。
在C语言中出现段错误是很常见的事,多数是由于访问越界或者未分配内存而对其进行赋值操作引起,但是在Linux C中也有另外一种情况可能引起段错误,那就是陷入死循环,这是一个偶然的发现,调试了n个小时之后,终于猜测到的段错误发生原因,测试可以证明: #include<stdio.h>
void print(int a)
{
if(a!=26)
{
printf("%d\n", a);
a++;
}
print(a);
}
int main()
{
print(0);
return 0;
}
进行编译: # > gcc -o main -g --std=c99 main.c运行后结果如下: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
段错误
从上面的例子,可以很容易发现,出现段错误的原因就是陷入死循环。 当然,平时我们不会出现像上面这么明显的弱智错误,这是故意测试用的一个简单例子,但是由于我们做算法时由于考虑不周,很可能出现死循环,从而导致段错误,也就是内存访问冲突问题,那种情况就不会像上面例子那样显而易见了,所以在程序出现段错误时,也要考虑到死循环问题。上述问题的引起原因是堆栈的溢出所导致的,由于每次调用print函数,陷入死循环后,只进栈,不出栈,而栈所分配的空间是有限的,所以到一定程度之后,栈将溢出,导致段错误的发生。
相关文章推荐
- 一种Linux中快速定位段错误的方法
- Linux下的段错误产生的原因及调试方法
- Linux 段错误调试Segment Fault
- Linux下的段错误产生的原因及调试方法
- Linux下使用-static -lpthread静态编译出现段错误(Segmentation fault)
- Linux下的段错误产生的原因及调试方法
- Linux下的段错误产生的原因及调试方法(转)
- linux 段错误调试方法
- Linux中快速定位段错误的方法
- Linux下的段错误产生的原因及调试方法(Zz)
- Linux下运行C++程序出现"段错误(核心已转储)"的原因
- LINUX下的段错误产生的原因及调试方法(推荐,转)
- linux下(ubuntu),段错误产生的原因Segmentation Fault
- 【转载】Linux下的段错误产生的原因及调试方法
- Linux下的段错误(segmentation fault)产生的原因及调试方法
- Linux下的段错误产生的原因及调试方法
- linux驱动调试--段错误之oops信息分析
- 调试:Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典)
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误
- 转载:Linux下的段错误产生的原因及调试方法