C: Valgrind говорит «Неверная запись размера 4», но не может найти проблему - PullRequest
0 голосов
/ 22 декабря 2019

Я довольно новичок в C и не могу найти ошибку, которую я получаю при отладке с помощью Valgrind. Вот ошибка, которую я получаю.

==1987== Invalid write of size 4
==1987==    at 0x108C17: init_TSEQ (sequence.c:51)
==1987==    by 0x1089A8: main (main1.c:14)
==1987==  Address 0x51e5490 is 0 bytes after a block of size 880 alloc'd
==1987==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==1987==    by 0x108B7E: init_TSEQ (sequence.c:38)
==1987==    by 0x1089A8: main (main1.c:14)

Видимо, проблема заключается в этой функции.

SEQUENCE *init_TSEQ(int nseq)
{
    DIR *D=opendir("sequences");
    struct dirent *entry;
    SEQUENCE *TSEQ=malloc(sizeof(SEQUENCE)*nseq);
    FILE *F;

    chdir("sequences");

    for(int i=0; (entry=readdir(D))!=NULL; i++)
    {
        if(entry->d_type==DT_REG)
        {
            char seq[MAXSIZE];

            F=fopen(entry->d_name, "r");
            fscanf(F, "%s", seq);
            TSEQ[i].lenght=strlen(seq);  // This is the line where the error comes from (l.51 in the code)

            for (int j=0; j<TSEQ[i].lenght; j++)
            {
                fscanf(F, "%c", seq);
                TSEQ[i].c[j]=seq[j];
            }

            fclose(F);
        }
    }

    closedir(D);

    return TSEQ;
}

А вот структура SEQUENCE, которую я использую:

struct sequence
{
    int lenght;
    char c[MAXSIZE]; // MAXSIZE equals to 40
};

typedef struct sequence SEQUENCE;

Как вы можете видеть в функции, я выделил память для поля TSEQ.lenght в этой строке:

SEQUENCE *TSEQ=malloc(sizeof(SEQUENCE)*nseq);

Так, где мне не хватало выделения памяти?

1 Ответ

1 голос
/ 22 декабря 2019

Итак, мне удалось решить проблему, изменив структуру кода:

SEQUENCE *init_TSEQ(int nseq)
{
    DIR *D=opendir("sequences");
    struct dirent *entry;
    SEQUENCE *TSEQ=malloc(sizeof(SEQUENCE)*nseq);
    FILE *F;
    int i=0;

    chdir("sequences");

    while(((entry=readdir(D))!=NULL) && (i<=nseq))
    {
        if(entry->d_type==DT_REG)
        {
            char seq[MAXSIZE];

            F=fopen(entry->d_name, "r");
            fscanf(F, "%s", seq);
            TSEQ[i].lenght=strlen(seq);

            for (int j=0; j<TSEQ[i].lenght; j++)
            {
                fscanf(F, "%c", seq);
                TSEQ[i].c[j]=seq[j];
            }

            fclose(F);
            i++;
        }
    }

    closedir(D);

    return TSEQ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...