C - 尝试使用strdup时的段错误

时间:2014-11-23 23:50:13

标签: c segmentation-fault strdup

我过去曾使用strdup(),就像我在这里使用它一样。我将token2传递给strdup,它是char *类型,其中包含一个有效指针,但是当我尝试运行该行" name = strdup(token2);"我的程序段错误,我不确定为什么。如果有人能够帮助我,我将不胜感激。我也意识到我的代码还没有返回正确的类型,我仍在努力编写所有代码。

struct YelpDataBST* create_business_bst(const char* businesses_path, const char* reviews_path){

  if(fopen(businesses_path,"r") == NULL || fopen(reviews_path,"r") == NULL)
    return NULL;
  FILE* fp_bp = fopen(businesses_path, "r");
  FILE* fp_rp = fopen(reviews_path, "r");

  struct YelpDataBST* yelp = malloc(sizeof(struct YelpDataBST*));

  int ID = -1;
  int tempID;
  long int addressOffset;
  long int reviewOffset;
  char line[2000];
  char line2[2000];
  char temp[2000];
  char temp2[2000];
  char* token;
  char* token2;
  char* name;
  int len;

  BusList* busNode = NULL;
  BusList* busList = NULL;
  BusTree* busTreeNode = NULL;
  BusTree* busTree = NULL;

  ID = -1;
  tempID = 0;
  fgets(line,2000,fp_rp);
  fgets(line2,2000,fp_bp);
  fseek(fp_rp,0, SEEK_SET);
  fseek(fp_bp,0,SEEK_SET);
  int ct = 0;
  while(!feof(fp_rp)){

     len = strlen(line);
     token = strtok(line, "\t");
     //printf("line: %s\n", line);
     token2 = strtok(line2, "\t");
     tempID = atoi((char*)strdup(token));
     if(ct == 0){
       tempID = 1;
       ct++;
     }

  if((ID != tempID || (ID < 0)) && tempID != 0){
    if(tempID == 1)
      tempID = 0;
    token2 = strtok(NULL, "\t");
    //name = strdup(token2);
    reviewOffset = ftell(fp_rp);
    if(tempID != 0)
      reviewOffset -= len;
    addressOffset = ftell(fp_bp);
    ID = atoi((char*)strdup(token));
    busList = BusNode_insert(busList, addressOffset, reviewOffset); //replace with create node for tree
    token2 = strtok(NULL, "\t");
    token2 = strtok(NULL, "\t");
    token2 = strtok(NULL, "\t");
    token2 = strtok(NULL, "\t");
    token2 = strtok(NULL, "\t");
    token2 = strtok(NULL, "\n");
    fgets(line2,2000,fp_bp);
  }
  token = strtok(NULL, "\t");
  token = strtok(NULL, "\t");
  token = strtok(NULL, "\t");
  token = strtok(NULL, "\t");
  token = strtok(NULL, "\n");
  fgets(line,2000,fp_rp);

  } 

  //BusList_print(busList);

}

1 个答案:

答案 0 :(得分:0)

strdup(token) segfaulting很可能由token为NULL来解释。 (无论如何你都不需要在这里进行争论)。将该段代码更改为:

if ( token == NULL )
{
    fprintf(stderr, "Invalid data in file.\n");
    exit(EXIT_FAILURE);  // or some other error handling
}

tempID = atoi(token);

然而,周围代码的一个更大问题是您尝试一次使用strtok两次。它保持内部状态,你只能有一个strtok&#34;正在进行中#34;在任何时候。第二个取消第一个。您必须重新设计该部分代码。


此外,while(!feof(fp_rp)) is wrong和您的yelp mallocs的字节数错误(尽管在发布的代码中,您实际上从未尝试在该存储中存储任何内容,因此它不会导致错误)。