Chinaunix
标题:
建立链表的一个段错误
[打印本页]
作者:
sumland
时间:
2011-07-22 10:53
标题:
建立链表的一个段错误
本帖最后由 sumland 于 2011-07-22 10:54 编辑
//有一个8M左右的文件,每一行都是(str1:str2:str3:str4)这样的格式。本程序读取文件的每一行,建立链表,以不同的str2所在的行分别作为链表的不同节点,
//并将具有相同的str2的行合并成一个节点的data.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char *data;
int num;//记录是str2字段出现的次数;
struct node *next;
}listnode,*linklist;
//添加一个节点,比较之前的节点的str2,若已有相同值,则串到该节点后;若无,则新增一个节点存储
listnode *add_line(char *line,listnode *head)
{
char newbuf[128];
char oldbuf[128];
memset(newbuf,0x0,128);
memset(oldbuf,0x0,128);
listnode *p=head;
listnode *q=head;
int flag=0;
while(p!=NULL)
{
sscanf(line,"%*[^:]:%[^:]",newbuf);
printf("p->data=%s\n",p->data);
sscanf(p->data,"%*[^:]:%[^:]",oldbuf);
if(strcmp(newbuf,oldbuf)==0)
{
char *tp=(char *)realloc(p->data,(strlen(p->data)+strlen(line)+1));
if(tp==NULL)
{
printf("realloc fault!\n");
break;
}
else
p->data=tp;
strcat(p->data,line);
p->num+=1;
flag=1;
break;
}
else
p=p->next;
}
if(flag==0)
{
while(q->next!=NULL)
q=q->next;
q->next=(listnode *)malloc(sizeof(listnode));
q->next->data=strdup(line);
q->next->num=1;
}
return head;
}
int main(int argc,char *argv[])
{
FILE *fp=fopen(argv[1],"r+");
char *line=(char *)malloc(1024);
memset(line,0x0,1024);
size_t len = 0;
ssize_t read;
//char buf[128];
//getline(&line, &len, fp);
fgets(line,1024,fp);
listnode *head =(listnode *)malloc(sizeof(listnode));
head->data=strdup(line);
head->num=1;
head->next=NULL;
memset(line,0x0,1024);
// while ((read = getline(&line, &len, fp)) != -1)
while(fgets(line,1024,fp)!=NULL)
{
add_line(line,head);
memset(line,0x0,1024);
}
if(line)
free(line);
listnode *nw=head;
int i=0;
while(nw!=NULL)
{
printf("%s,%d,%d\n",nw->data,nw->num,i);
i++;
nw=nw->next;
}
return 0;
}
复制代码
运行出现段错误,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
根据现象分析了一下代码,发现可能存在问题的语句段如下:
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
作者:
sumland
时间:
2011-07-28 11:57
回复
2#
foolishx
嗯,谢谢了!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2