fclose () powoduje błąd segmentacji

Mam plik tekstowy rozdzielany tabulatorami, który analizuję. Pierwsza kolumna zawiera ciągi formatuchrX, gdzieX oznacza zestaw łańcuchów, np. „1”, „2”, ..., „X”, „Y”.

Są one przechowywane w achar* nazywachromosome, gdy plik jest analizowany.

Plik tekstowy jest posortowany leksykograficznie w pierwszej kolumnie, tj. Będę miał kilka wierszy rozpoczynających się od „chr1”, a następnie „chr2” itd.

Przy każdym wpisie „chrX” muszę otworzyć inny plik powiązany z tym wpisem:

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

Mam funkcjęopenSourceFile to jest zdefiniowane w następujący sposób:

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);                                                                                                                                                         
    }                                                                                                                                                                             
}      

Problem polega na tym, że moja aplikacja kończy działanie z błędem segmentacji przechodzącym z pierwszego chromosomu do drugiego (zchr1 dochr2) w następującym wierszu, gdzie zamykam pierwszy otwarty plik chromosomu:

fclose(merbaseIn);

Wiem, że nie przechodzęfclose wskaźnik NULL, ponieważ aż do błędu segmentacji, czytam dane z tego pliku. Mogę nawet zawinąć to warunkowo i nadal otrzymuję błąd:

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

Ponadto wiemopenSourceFile działa (przynajmniej nachr1, podczas konfigurowania pierwszego uchwytu plikuFILE*), ponieważ moja aplikacja analizujechr1 wiersze i odczytuje dane zFILE* plik źródłowy poprawnie.

O co w tym chodzifclose wywołanie, które powoduje wystąpienie błędu segmentacji?

questionAnswers(8)

yourAnswerToTheQuestion