chrX
的字符串,其中X
表示一组字符串,例如"1"、"2"、...、"X"、"Y"。这些字符串在解析文件时被存储在名为
chromosome
的char*
中。文本文件按字典序对第一列进行排序,即我将拥有许多以"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
传递NULL指针,因为在出现分段错误之前,我正在从这个文件中读取数据。我甚至可以将其包装在条件语句中,但仍然会出现错误:
if (merbaseIn != NULL) {
fclose(merbaseIn);
}
此外,我知道openSourceFile
是可行的(至少对于chr1
来说,当设置第一个FILE*
文件句柄时),因为我的应用程序解析chr1
行并正确地从FILE*
源文件读取数据。
是什么导致这个fclose
调用导致发生分段错误?
free
。我也没有在其他地方释放指针。我放弃了这个应用程序,从头开始编写,并在进行编写时运行valgrind
以确保我正确地管理内存。感谢您向我介绍这个工具! - Alex Reynolds