2014-11-23 3 views
0

Я использовал strdup() в прошлом так же, как и я здесь. Я передаю token2 в strdup, который имеет тип char * с допустимым указателем в нем, но когда я пытаюсь запустить строку «name = strdup (token2)»; моя программа segfaults, и я совершенно не уверен, почему. Если кто-то сможет мне помочь, это будет очень признательно. Я также понимаю, что мой код еще не возвращает правильный тип, я все еще работаю над написанием всего этого.C - segfault при попытке использовать strdup

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

Эта строка выделяет неправильное количество байтов: 'struct YelpDataBST * yelp = malloc (sizeof (struct YelpDataBST *));' –

+1

'tempID = atoi ((char *) strdup (токен));' будет утечка памяти. (используется указатель strdup() d, но не назначается) – wildplasser

+0

Да, как говорит wildplasser; вам нужно только 'tempID = atoi (токен);' (и нет необходимости вводить символ char * в char * ... –

ответ

0

strdup(token) segfaulting, скорее всего, объясняется token существом NULL. (В любом случае, вам не нужно вставлять strdup). Изменить этот кусок кода на:

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

tempID = atoi(token); 

Однако большая проблема с окружающим кодом является то, что вы пытаетесь использовать strtok дважды за один раз. Он поддерживает внутреннее состояние, и вы можете иметь только один strtok «в процессе» в любой момент времени. Второй отменяет первый. Вам придется перепроектировать этот раздел кода.


Кроме того, while(!feof(fp_rp)) is wrong, и ваши yelp mallocs неверное число байтов (хотя в коде отправил вас никогда не пытаться хранить что-либо в этом хранилище, так что это не вызовет ошибку только пока).

+0

Это странная вещь, место, где программа segfaults находится в разделе комментариев, в котором указано «имя = strdup (token2) ", и я запустил эту программу через gdb и проверил, имеет ли token2 значение null в точке, где он segfaults, но это не так, он содержит указатель на символ. Вот почему я не понимаю, почему это давая мне segfault –

+0

@ user3466964, вам нужно опубликовать [MCVE] (http://stackoverflow.com/help/MCVE), чтобы кто-то отлаживал ваш код. В его нынешнем виде слишком много неизвестных, например, возможно, вы вызвали куча коррупции перед входом в эту функцию –

+0

Я понял, почему это было segfault, и устранили проблему, спасибо за помощь! Не могли бы вы объяснить, сколько визгов выдает неверное количество байтов? Я немного смущен относительно того, что вы подразумеваете под этим как я mallocing sizeof (struct YelpDataBST *). Wou ldn't, что просто malloc количество байтов, необходимых для этого типа структуры? –

Смежные вопросы