fclose () вызывает ошибку сегментации

У меня есть текстовый файл с разделителями табуляции, который я анализирую. Его первый столбец содержит строки форматаchrX, гдеX обозначает набор строк, например, «1», «2», ..., «X», «Y».

Каждый из них хранится вchar* называетсяchromosome, как файл анализируется.

Текстовый файл отсортирован по первому столбцу лексикографически, то есть у меня будет ряд строк, начинающихся с "chr1", а затем "chr2" и т. Д.

При каждой записи "chrX" мне нужно открыть другой файл, связанный с этой записью:

FILE *merbaseIn;

// loop through rows...

if (chromosome == NULL)                                                                                                                                                   
    openSourceFile(&chromosome, fieldArray[i], &merbaseIn, GENPATHIN);                                                                                                      
else {                                                                                                                                                                    
    if (strcmp(chromosome, fieldArray[i]) != 0) { // new chromosome                                                                                                   
        fclose(merbaseIn); // close old chromosome FILE ptr                                                                                                                                                                                                                                    
        free(chromosome); // free old chromosome ptr                                                                                                                          
        openSourceFile(&chromosome, fieldArray[i], &merbaseIn, GENPATHIN); // set up new chromosome FILE ptr                                                                  
    }                                                                                                                                                                       
}  
// parse row

У меня есть функцияopenSourceFile это определяется следующим образом:

void openSourceFile (char** chrome, const char* field, FILE** filePtr, const char *path) {
    char filename[100];                                                                                                                                                           
    *chrome = (char *) malloc ((size_t) strlen(field));
    if (*chrome == NULL) {                                                                                                                                                        
        fprintf(stderr, "ERROR: Cannot allocate memory for chromosome name!");                                                                                                      
        exit(EXIT_FAILURE);                                                                                                                                                         
    }                                                                                                                                                                             

    strcpy(*chrome, field);                                                                                                                                                       
    sprintf(filename,"%s%s.fa", path, field);                                                                                                                                     

    *filePtr = fopen(filename, "r");                                                                                                                                              
    if (*filePtr == NULL) {                                                                                                                                                       
        fprintf(stderr, "ERROR: Could not open fasta source file %s\n", filename);                                                                                                  
        exit(EXIT_FAILURE);                                                                                                                                                         
    }                                                                                                                                                                             
}      

Проблема в том, что мое приложение закрывается с ошибкой сегментации, идущей от первой хромосомы ко второй (изchr1 вchr2) в следующей строке, где я закрываю первый файл хромосомы, который я открыл:

fclose(merbaseIn);

Я знаю, я не прохожуfclose нулевой указатель, потому что вплоть до ошибки сегментации я читаю данные из этого файла. Я могу даже обернуть это в условное, и я все еще получаю ошибку:

if (merbaseIn != NULL) {
    fclose(merbaseIn);
}

Далее я знаюopenSourceFile работает (хотя бы дляchr1при настройке первого дескриптора файлаFILE*) потому что мое приложение анализируетchr1 строки и читает данные изFILE* исходный файл правильно.

Что это об этомfclose вызов, вызывающий ошибку сегментации?

Ответы на вопрос(8)

Ваш ответ на вопрос