-
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
-
段错误
-
Linux C 段错误
tt
posted @ 2007年8月08日 04:33
in 程序调试
, 9233 阅读
在C语言中出现段错误是很常见的事,多数是由于访问越界或者未分配内存而对其进行赋值操作引起,但是在Linux C中也有另外一种情况可能引起段错误,那就是陷入死循环,这是一个偶然的发现,调试了n个小时之后,终于猜测到的段错误发生原因,测试可以证明:
-
#include<stdio.h>
-
-
void print(int a)
-
{
-
if(a!=26)
-
{
-
a++;
-
}
-
print(a);
-
}
-
-
int main()
-
{
-
print(0);
-
-
return 0;
-
}
进行编译:
# > gcc -o main -g --std=c99 main.c
运行后结果如下:
从上面的例子,可以很容易发现,出现段错误的原因就是陷入死循环。
当然,平时我们不会出现像上面这么明显的弱智错误,这是故意测试用的一个简单例子,但是由于我们做算法时由于考虑不周,很可能出现死循环,从而导致段错误,也就是内存访问冲突问题,那种情况就不会像上面例子那样显而易见了,所以在程序出现段错误时,也要考虑到死循环问题。
上述问题的引起原因是堆栈的溢出所导致的,由于每次调用print函数,陷入死循环后,只进栈,不出栈,而栈所分配的空间是有限的,所以到一定程度之后,栈将溢出,导致段错误的发生。
2007年8月08日 10:40
呵呵,这是堆栈溢出呀~
2007年8月08日 20:03
2007年8月10日 00:24
呵呵,,
明白了。。。
2013年8月13日 16:24
段错误真是烦啊,我这里弄了好久没搞定!哎!