免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1310 | 回复: 3
打印 上一主题 下一主题

一个段简单程序怎么出的错,大家帮看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-02 09:04 |只看该作者 |倒序浏览
不多说了直接看代码.
  1. //
  2. //统计line<550的个数
  3. //

  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. #include<unistd.h>
  8. int main()
  9. {
  10.         int i = 0,j,num;
  11.         FILE *fd;
  12.         char fline[200],*a,*b;
  13.        
  14.         if(  ( fd = fopen("/home/changminghua/code/qyld.log.2007-03-01.11","r") ) == NULL  )
  15.         printf("open log error");
  16.        
  17.         a = malloc(200);
  18.         b = malloc(10);
  19.        

  20.         while(!feof(fd))
  21.         {
  22.                 memset(a,0x00,200);
  23.                 memset(b,0x00,10);
  24.                 memset(fline,0x00,200);
  25.                 fgets(fline,200,fd);
  26.        
  27.                 if( (a = strstr(fline,"line=")) != NULL  )
  28.                 {
  29.                         for(j = 0 ; *(a+5+j) != ',';j++)        //1。取line=后面的整数
  30.                         *(b+j) = *(a+5+j);        //
  31.                         if ( (num=atoi(b))<550 )        //2。统计line小于550的个数       
  32.                         i = i+1;
  33.                 };
  34.         }
  35.        
  36.        
  37.         fclose(fd);
  38.         free(a);
  39.         free(b);
  40.         printf("line <550 的个数为 %d\n",i);
  41.         return 0;
  42. }
复制代码


gdb第二次跟到fgets这里就报段错

27                      fgets(fline,200,fd);
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x40080454 in fgets () from /lib/libc.so.6

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-03-02 09:13 |只看该作者
这个程序错误很多。
首先不应该使用while(!feof(fd))这种方式
来判断文件的结束。原因本版已有很多描述,
自己搜吧。
在if( (a = strstr(fline,"line=")) != NULL  )
中,a先前所指的空间发生内存泄露。a指向fline数组的某个位置,
而在第二次的循环中,memset(a,0x00,200);
又对a所的内容清零,已经发生了数组访问越界。

自己好好想一想你的逻辑有没有问题。

论坛徽章:
0
3 [报告]
发表于 2007-03-02 09:59 |只看该作者
谢谢,我知道是哪里的错了.但是发生错误之后为什么第二次fd为0了?
  1. 4              while(!feof(fd))
  2. (gdb)
  3. 26                      memset(a,0x00,200);
  4. (gdb) p fd
  5. $2 = (FILE *) 0x8049a38
  6. (gdb) n
  7. 27                      memset(b,0x00,10);
  8. (gdb) n
  9. 28                      memset(fline,0x00,200);
  10. (gdb) p fd
  11. $3 = (FILE *) 0x0
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-03-02 10:01 |只看该作者
原帖由 cmh_2003 于 2007-3-2 09:59 发表
谢谢,我知道是哪里的错了.但是发生错误之后为什么第二次fd为0了?
[code]4              while(!feof(fd))
(gdb)
26                      memset(a,0x00,200);
(gdb) p fd
$2 = (FILE *) 0x8049a38
(gdb)  ...

你数组访问越界,
在memset时,可能把fd所在的内存空间
也给清零了。
遇到问题还是多想想吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP