C:读取文件中的第二行后,Realloc()导致垃圾值

时间:2018-11-19 11:10:17

标签: c dynamic-memory-allocation realloc fasta

我正在尝试从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),相同的代码给了我像“(???”)这样的垃圾字符。我假设问题是重新分配指向某种类型垃圾内存,但我不明白为什么第一行和第二行的垃圾内存会有所不同。

您能提供的任何帮助将不胜感激!谢谢!

2 个答案:

答案 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