C: Realloc () после чтения второй строки в файле приводит к значениям мусора - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь прочитать последовательности из файла 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 + str)) ; дает мне пустой символьный массив, на который я могу объединить, но для второй строки (LLLLLLLLLLGWTSGTLLLLLLLLLLL) тот же код дает мне мусорные символы, такие как "(???". Я предполагаю, что проблема заключается в том, что перераспределение указывает на какой-то вид мусорной памяти, но я не понимаю, почему она будет отличаться для первой и второй строк.

Любая помощь, которую вы можете оказать, будет принята с благодарностью! Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Проблема здесь в том, что первый realloc получает значение nbSeq как 0, которое не выделяет никакой памяти.

Замените

int nbSeq=-1;

на

int nbSeq=0;

Получите доступ к индексу с помощью lesSeq[nbSeq - 1]

0 голосов
/ 19 ноября 2018

Некоторые программисты, чувак, уже отмечали, что вы не выделяете достаточно памяти.

Вы также, вероятно, ожидаете некоторого поведения от realloc, которое не произойдет.

Вы вызываете reallocс NULL указателями.Это заставит его вести себя так же, как и malloc.

Для первой строки (AAAAAAAAAAGWTSGTAAAAAAAAAAA), ... = realloc ();дает мне пустой массив символов, на который я могу конкатенировать, но для второй строки (LLLLLLLLLLGWTSGTLLLLLLLLLLL) тот же код дает мне символы мусора, такие как "(???".

Вы не должны ожидать каких-либо указанийсодержимое вашей выделенной памяти. В частности, ячейка памяти не установлена ​​на 0. Если вы хотите положиться на это, вы можете использовать calloc. Или вы просто назначаете 0 первой ячейке памяти.

На самом деле вы ничего не объединяете. Вместо этого вы выделяете новую память, где вы можете просто использовать strcpy вместо strcat.

...