C代码 - 分段错误

时间:2016-04-03 04:37:14

标签: c pointers allocation

我正在尝试编译我的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;
}

根据一些文章,分段错误是由于尝试读取或写入非法内存位置引起的。因为我在代码的不同部分分配内存,所以问题就在那里。有人可以帮我这个。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  1. if(fp=NULL)应为if(fp == NULL)
  2. char *fields[5];应为char *fields[5] = {NULL};
  3. for(;token!=NULL;i++){应为for(; token != NULL && i < 5; i++){
  4. 这些:

    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);
    
  5. 你不会free几个malloc内存。