我正在尝试编译我的c代码,但在执行程序后我总是遇到Segmentation错误。这是我的代码的一部分:
LINE_LENGTH=300
struct clip {
int views;
char *user;
char *id;
char *title;
char *duration;
struct clip *next;
} *head;
我的主要功能,其中argv [1]是我的csv文件
int main(int argc, char **argv) {
int n;
head = build_a_lst(*(argv+1));
return 0;}
我的其余代码
struct clip *build_a_lst(char *fn) {
FILE *fp;
struct clip *hp;
char *fields[5];
char line[LINE_LENGTH];
int cnt=0,i;
hp=NULL;
fp=fopen(fn,"r");
if(fp=NULL)
exit(EXIT_FAILURE);
while(fgets(line,LINE_LENGTH,fp)!=NULL){
split_line(fields,line);//fields has five values stored
hp=append(hp,fields);
for(i=0;i<5;i++){
free(fields[i]);
fields[i]=NULL;
}
}
return hp;
}
void split_line(char **fields,char *line) {
int i=0;
char *token, *delim;
delim = ",\n";
token=strtok(line,delim);//ok line
for(;token!=NULL;i++){
fields[i]=malloc(strlen(token)+1);
strcpy(fields[i],token);
token=strtok(NULL,delim);
}
}
struct clip *append(struct clip *hp,char **five) {
struct clip *cp,*tp;
tp=malloc(sizeof(struct clip));
tp->views=atoi(five[1]);
tp->user=malloc(strlen(five[0]+1));
tp->duration=malloc(strlen(five[2]+1));
tp->id=malloc(strlen(five[3]+1));
tp->title=malloc(strlen(five[4]+1));
strcpy(tp->user,five[0]);
strcpy(tp->duration,five[2]);
strcpy(tp->id,five[3]);
strcpy(tp->title,five[4]);
cp=hp;
while(cp!=NULL)
cp=cp->next;
cp->next=tp;
hp=cp;
return hp;
}
根据一些文章,分段错误是由于尝试读取或写入非法内存位置引起的。因为我在代码的不同部分分配内存,所以问题就在那里。有人可以帮我这个。提前谢谢。
答案 0 :(得分:1)
您的代码存在一些问题:
if(fp=NULL)
应为if(fp == NULL)
char *fields[5];
应为char *fields[5] = {NULL};
for(;token!=NULL;i++){
应为for(; token != NULL && i < 5; i++){
这些:
tp->user=malloc(strlen(five[0]+1));
tp->duration=malloc(strlen(five[2]+1));
tp->id=malloc(strlen(five[3]+1));
tp->title=malloc(strlen(five[4]+1));
应该是
tp -> user = malloc(strlen(five[0]) + 1);
tp -> duration = malloc(strlen(five[2]) + 1);
tp -> id = malloc(strlen(five[3]) + 1);
tp -> title = malloc(strlen(five[4]) + 1);
free
几个malloc
内存。