Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16445
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 86
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-04 12:28
个人简介

当牛人牛到一定的境界,可能就会重归和平,所以我还是一个一直梦想成为hacker的屌丝愤青!

文章分类
文章存档

2013年(6)

我的朋友

分类: C/C++

2013-06-07 12:58:15

前段时间遇到一个段错误,废了半天劲找到了原因,其实新手都能一眼就看出问题所在,但由于最初习惯不太好和定式思维的影响,花了很长时间来找这个问题。现将问题贴出来分析:
一、buffer内存出问题
出错代码:str = fgets(tmpbuf,sizeof(tmpbuf),pf);
其中 str 是char * 型指针,pf是打开的文件指针
我们知道fgets读取时如果遇到换行符会自动结束,如果文件里的一行数据长度 > sizeof(tmpbuf);这时,读取的实际长度是sizeof(tmpbuf),但tmpbuf最后没有空间来存'\n'换行符,就只能存放到后面连续的内存空间,破坏掉了其他存储块的内存数据,导致了不可预知的内存污染,程序出现各种毛病,如段错误,卡死 ......等待。
正确做法是:
方法1、str = fgets(tmpbuf,sizeof(tmpbuf) - 1,pf);
方法2、把tmpbuf的长度定义的足够大,使之不可能出现一行数据长度 > sizeof(tmpbuf)的情况,但不建议这种做法,因为这样大部分时候是造成内存浪费的,除非特别需要。
最后总结,良好的编程习惯很重要!!!

二、格式化打印函数出问题
    格式化打印函数 如printf/srprintf/sprintf,如果格式不匹配,偶尔也会出现段错误(具体哪种情况忘了,时间有点久远了),这个之前遇到过,但是当时忘了记下,以后注意就是
    


阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~