亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
建立鏈表的一個段錯誤
[打印本頁]
作者:
sumland
時間:
2011-07-22 10:53
標題:
建立鏈表的一個段錯誤
本帖最后由 sumland 于 2011-07-22 10:54 編輯
//有一個8M左右的文件,每一行都是(str1:str2:str3:str4)這樣的格式。本程序讀取文件的每一行,建立鏈表,以不同的str2所在的行分別作為鏈表的不同節(jié)點,
//并將具有相同的str2的行合并成一個節(jié)點的data.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char *data;
int num;//記錄是str2字段出現(xiàn)的次數(shù);
struct node *next;
}listnode,*linklist;
//添加一個節(jié)點,比較之前的節(jié)點的str2,若已有相同值,則串到該節(jié)點后;若無,則新增一個節(jié)點存儲
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;
}
復制代碼
運行出現(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