亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1331 | 回復(fù): 3
打印 上一主題 下一主題

一個(gè)段簡單程序怎么出的錯(cuò),大家?guī)涂纯?/a> [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-03-02 09:04 |只看該作者 |倒序?yàn)g覽
不多說了直接看代碼.
  1. //
  2. //統(tǒng)計(jì)line<550的個(gè)數(shù)
  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=后面的整數(shù)
  30.                         *(b+j) = *(a+5+j);        //
  31.                         if ( (num=atoi(b))<550 )        //2。統(tǒng)計(jì)line小于550的個(gè)數(shù)       
  32.                         i = i+1;
  33.                 };
  34.         }
  35.        
  36.        
  37.         fclose(fd);
  38.         free(a);
  39.         free(b);
  40.         printf("line <550 的個(gè)數(shù)為 %d\n",i);
  41.         return 0;
  42. }
復(fù)制代碼


gdb第二次跟到fgets這里就報(bào)段錯(cuò)

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

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

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2007-03-02 09:13 |只看該作者
這個(gè)程序錯(cuò)誤很多。
首先不應(yīng)該使用while(!feof(fd))這種方式
來判斷文件的結(jié)束。原因本版已有很多描述,
自己搜吧。
在if( (a = strstr(fline,"line=")) != NULL  )
中,a先前所指的空間發(fā)生內(nèi)存泄露。a指向fline數(shù)組的某個(gè)位置,
而在第二次的循環(huán)中,memset(a,0x00,200);
又對a所的內(nèi)容清零,已經(jīng)發(fā)生了數(shù)組訪問越界。

自己好好想一想你的邏輯有沒有問題。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2007-03-02 09:59 |只看該作者
謝謝,我知道是哪里的錯(cuò)了.但是發(fā)生錯(cuò)誤之后為什么第二次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
復(fù)制代碼

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
4 [報(bào)告]
發(fā)表于 2007-03-02 10:01 |只看該作者
原帖由 cmh_2003 于 2007-3-2 09:59 發(fā)表
謝謝,我知道是哪里的錯(cuò)了.但是發(fā)生錯(cuò)誤之后為什么第二次fd為0了?
[code]4              while(!feof(fd))
(gdb)
26                      memset(a,0x00,200);
(gdb) p fd
$2 = (FILE *) 0x8049a38
(gdb)  ...

你數(shù)組訪問越界,
在memset時(shí),可能把fd所在的內(nèi)存空間
也給清零了。
遇到問題還是多想想吧。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP