我正在尝试从FASTA文件中读取序列到我创建的结构表中,每个结构都包含一个称为“ seq”的字符数组成员。我的代码似乎在第一个循环中运行良好,但是当我为第二个序列重新分配内存时,指针似乎指向垃圾值,然后strcat()方法给我一个段错误。
这是我要读取的整个FASTA文件:
>1
AAAAAAAAAAGWTSGTAAAAAAAAAAA
>2
LLLLLLLLLLGWTSGTLLLLLLLLLLL
>3
CCCCCCCCCCGWTSGTCCCCCCCCCCC
这是代码(很抱歉,某些变量名是法语):
typedef struct _tgSeq { char *titre ; char *seq ; int lg ; } tgSeq ;
#define MAX_SEQ_LN 1000
tgSeq* readFasta(char *nomFile) {
char ligne[MAX_SEQ_LN];
tgSeq *lesSeq = NULL;
int nbSeq=-1;
FILE *pF = fopen(nomFile, "r");
while(fgets(ligne, MAX_SEQ_LN, pF) != NULL) {
if(ligne[0] == '>') {
/*create a new sequence*/
nbSeq++;
//reallocate memory to keep the new sequence in the *lesSeq table
lesSeq = realloc(lesSeq, (nbSeq)*sizeof(tgSeq));
//allocate memory for the title of the new sequence
lesSeq[nbSeq].titre = malloc((strlen(ligne)+1)*sizeof(char));
//lesSeq[nbSeq+1].titre becomes a pointer that points to the same memory as ligne
strcpy(lesSeq[nbSeq].titre, ligne);
//Now we create the new members of the sequence that we can fill with the correct information later
lesSeq[nbSeq].lg = 0;
lesSeq[nbSeq].seq = NULL;
} else {
/*fill the members of the sequence*/
//reallocate memory for the new sequence
lesSeq[nbSeq].seq = realloc(lesSeq[nbSeq].seq, (sizeof(char)*(lesSeq[nbSeq].lg+1+strlen(ligne))));
strcat(lesSeq[nbSeq].seq, ligne);
lesSeq[nbSeq].lg += strlen(ligne);
}
}
// Close the file
fclose(pF);
return lesSeq;
}
对于第一行(AAAAAAAAAAGWTSGTAAAAAAAAAAA),lesSeq [nbSeq] .seq = realloc(lesSeq [nbSeq] .seq,(sizeof(char)*(lesSeq [nbSeq] .lg + 1 + strlen(ligne)))));给了我一个可以连接的空字符数组,但是对于第二行(LLLLLLLLLLGWGWTSGTLLLLLLLLLLL),相同的代码给了我像“(???”)这样的垃圾字符。我假设问题是重新分配指向某种类型垃圾内存,但我不明白为什么第一行与第二行会有所不同。
您能提供的任何帮助将不胜感激!谢谢!
最佳答案
这里的问题是第一次重新分配将nbSeq的值设置为0,这不会分配任何内存。
更换
int nbSeq=-1;
与
int nbSeq=0;
使用
lesSeq[nbSeq - 1]
访问索引