我正在尝试从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),相同的代码给了我像“(???”)这样的垃圾字符。我假设问题是重新分配指向某种类型垃圾内存,但我不明白为什么第一行和第二行的垃圾内存会有所不同。
您能提供的任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
这里的问题是第一次重新分配将nbSeq的值设置为0,这不分配任何内存。
替换
int nbSeq=-1;
与
int nbSeq=0;
使用lesSeq[nbSeq - 1]
答案 1 :(得分:0)
一些程序员老兄已经指出您没有分配足够的内存。
您似乎还期望realloc
会发生某些行为。
您使用realloc
指针调用NULL
。这将使其行为与malloc
相同。
对于第一行(AAAAAAAAAAGWTSGTAAAAAAAAAAA),... = realloc();给了我一个可以连接的空字符数组,但是对于第二行(LLLLLLLLLLGWGWTSGTLLLLLLLLLLL),相同的代码给了我像“(???”)这样的垃圾字符。
您不应期望分配的内存有任何特定内容。特别是内存位置未设置为0。如果要依靠它,可以使用calloc
。
或者,您只需将0
分配给第一个存储位置。
您并没有真正连接任何东西。取而代之的是,您分配新的内存,而您可以仅使用strcpy
而不是strcat
。