免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4859 | 回复: 2

建立链表的一个段错误 [复制链接]

论坛徽章:
0
发表于 2011-07-22 10:53 |显示全部楼层
本帖最后由 sumland 于 2011-07-22 10:54 编辑
  1. //有一个8M左右的文件,每一行都是(str1:str2:str3:str4)这样的格式。本程序读取文件的每一行,建立链表,以不同的str2所在的行分别作为链表的不同节点,
  2. //并将具有相同的str2的行合并成一个节点的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字段出现的次数;
  10. struct node *next;       
  11. }listnode,*linklist;


  12. //添加一个节点,比较之前的节点的str2,若已有相同值,则串到该节点后;若无,则新增一个节点存储
  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. }
复制代码
运行出现段错误,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

论坛徽章:
0
发表于 2011-07-22 13:32 |显示全部楼层
回复 1# sumland


    根据现象分析了一下代码,发现可能存在问题的语句段如下:
if(flag==0)
        {         
                while(q->next!=NULL)
                        q=q->next;                                                
                q->next=(listnode *)malloc(sizeof(listnode));   //这里malloc之后,没有对数据进行初始化,特别是malloc出来的listnode节点的next域.
                q->next->data=strdup(line);
                q->next->num=1;                        
        }      

由于上述的listnode结点的next域没有初始化,所以很有可能出现不可预料的值 ,也就会导致你程序运行时,不定期的出现p->data的访问的segment fault

论坛徽章:
0
发表于 2011-07-28 11:57 |显示全部楼层
回复 2# foolishx


    嗯,谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP