我正在尝试从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]访问索引

10-06 10:23