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

Chinaunix

標題: 建立鏈表的一個段錯誤 [打印本頁]

作者: sumland    時間: 2011-07-22 10:53
標題: 建立鏈表的一個段錯誤
本帖最后由 sumland 于 2011-07-22 10:54 編輯
  1. //有一個8M左右的文件,每一行都是(str1:str2:str3:str4)這樣的格式。本程序讀取文件的每一行,建立鏈表,以不同的str2所在的行分別作為鏈表的不同節(jié)點,
  2. //并將具有相同的str2的行合并成一個節(jié)點的data.
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<string.h>

  6. typedef struct node
  7. {
  8. char *data;
  9. int num;//記錄是str2字段出現(xiàn)的次數(shù);
  10. struct node *next;       
  11. }listnode,*linklist;


  12. //添加一個節(jié)點,比較之前的節(jié)點的str2,若已有相同值,則串到該節(jié)點后;若無,則新增一個節(jié)點存儲
  13. listnode *add_line(char *line,listnode *head)
  14. {
  15.         char newbuf[128];
  16.         char oldbuf[128];
  17.         memset(newbuf,0x0,128);
  18.         memset(oldbuf,0x0,128);
  19.         listnode *p=head;
  20.         listnode *q=head;
  21.         int flag=0;
  22.         while(p!=NULL)
  23.         {
  24.          sscanf(line,"%*[^:]:%[^:]",newbuf);
  25.        
  26.          printf("p->data=%s\n",p->data);
  27.          sscanf(p->data,"%*[^:]:%[^:]",oldbuf);
  28.          
  29.          if(strcmp(newbuf,oldbuf)==0)
  30.                  {
  31.                 
  32.                          char *tp=(char *)realloc(p->data,(strlen(p->data)+strlen(line)+1));
  33.                          if(tp==NULL)
  34.                                          {
  35.                                                  printf("realloc fault!\n");
  36.                                                  break;
  37.                                          }
  38.                          else
  39.                                  p->data=tp;
  40.                          strcat(p->data,line);                        
  41.                          p->num+=1;
  42.                          flag=1;
  43.                          break;
  44.                  }
  45.          else                        
  46.                  p=p->next;         
  47.         }
  48.        
  49.         if(flag==0)
  50.         {         
  51.                 while(q->next!=NULL)
  52.                         q=q->next;                                               
  53.                 q->next=(listnode *)malloc(sizeof(listnode));
  54.                 q->next->data=strdup(line);
  55.                 q->next->num=1;                       
  56.         }       

  57. return head;                                       
  58. }



  59. int main(int argc,char *argv[])
  60. {
  61.        
  62. FILE *fp=fopen(argv[1],"r+");
  63. char *line=(char *)malloc(1024);
  64. memset(line,0x0,1024);
  65. size_t len = 0;
  66. ssize_t  read;
  67. //char buf[128];
  68. //getline(&line, &len, fp);

  69. fgets(line,1024,fp);
  70. listnode *head =(listnode *)malloc(sizeof(listnode));
  71. head->data=strdup(line);
  72. head->num=1;
  73. head->next=NULL;
  74. memset(line,0x0,1024);       
  75. //        while ((read = getline(&line, &len, fp)) != -1)
  76. while(fgets(line,1024,fp)!=NULL)
  77. {                                                                                 
  78.         add_line(line,head);
  79.         memset(line,0x0,1024);                                                                        
  80. }

  81. if(line)
  82.     free(line);
  83.    
  84. listnode *nw=head;  
  85. int i=0;
  86. while(nw!=NULL)
  87. {
  88. printf("%s,%d,%d\n",nw->data,nw->num,i);
  89. i++;
  90. nw=nw->next;       
  91. }   
  92.        
  93. return 0;       
  94. }
復制代碼
運行出現(xiàn)段錯誤,gdb查出
#0  0x08048688 in add_line (line=0x87ac170 "tel:13391181435:ָ6:gb2312\r\n", head=0x87ac57 at myfsort.c:28

warning: Source file is more recent than executable.

28               sscanf(p->data,"%*[^:]:%[^:]",oldbuf);
(gdb) p p->data
Cannot access memory at address 0xcfc93a30
作者: foolishx    時間: 2011-07-22 13:32
回復 1# sumland


    根據(jù)現(xiàn)象分析了一下代碼,發(fā)現(xiàn)可能存在問題的語句段如下:
if(flag==0)
        {         
                while(q->next!=NULL)
                        q=q->next;                                                
                q->next=(listnode *)malloc(sizeof(listnode));   //這里malloc之后,沒有對數(shù)據(jù)進行初始化,特別是malloc出來的listnode節(jié)點的next域.
                q->next->data=strdup(line);
                q->next->num=1;                        
        }      

由于上述的listnode結點的next域沒有初始化,所以很有可能出現(xiàn)不可預料的值 ,也就會導致你程序運行時,不定期的出現(xiàn)p->data的訪問的segment fault
作者: sumland    時間: 2011-07-28 11:57
回復 2# foolishx


    嗯,謝謝了!




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2