前段时间遇到一个段错误,废了半天劲找到了原因,其实新手都能一眼就看出问题所在,但由于最初习惯不太好和定式思维的影响,花了很长时间来找这个问题。现将问题贴出来分析:
一、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,如果格式不匹配,偶尔也会出现段错误(具体哪种情况忘了,时间有点久远了),这个之前遇到过,但是当时忘了记下,以后注意就是
阅读(518) | 评论(0) | 转发(0) |