Linux C 段错误

原文地址:http://tzc.is-programmer.com/posts/252.html


在C语言中出现段错误是很常见的事,多数是由于访问越界或者未分配内存而对其进行赋值操作引起,但是在Linux C中也有另外一种情况可能引起段错误,那就是陷入死循环,这是一个偶然的发现,调试了n个小时之后,终于猜测到的段错误发生原因,测试可以证明:

 

  1. #include<stdio.h>
  2.  
  3. void print ( int a )
  4. {
  5.      if (a!= 26 )
  6.      {
  7.          printf ( "%d\n", a );
  8.         a++;
  9.      }
  10.     print (a );       
  11. }
  12.  
  13. int main ( )
  14. {
  15.     print ( 0 );
  16.    
  17.      return  0;
  18. }

进行编译:

 

 

# >  gcc -o main -g --std=c99 main.c

运行后结果如下:

 

 

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14. 13
  15. 14
  16. 15
  17. 16
  18. 17
  19. 18
  20. 19
  21. 20
  22. 21
  23. 22
  24. 23
  25. 24
  26. 25
  27. 段错误
  28.  

从上面的例子,可以很容易发现,出现段错误的原因就是陷入死循环。

 

当然,平时我们不会出现像上面这么明显的弱智错误,这是故意测试用的一个简单例子,但是由于我们做算法时由于考虑不周,很可能出现死循环,从而导致段错误,也就是内存访问冲突问题,那种情况就不会像上面例子那样显而易见了,所以在程序出现段错误时,也要考虑到死循环问题。

上述问题的引起原因是堆栈的溢出所导致的,由于每次调用print函数,陷入死循环后,只进栈,不出栈,而栈所分配的空间是有限的,所以到一定程度之后,栈将溢出,导致段错误的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值