C: программа печатает мусорный текст даже после освобождения структур - PullRequest
1 голос
/ 31 октября 2019

У меня есть программа со следующими структурами:

typedef struct slide
{
    int number;
    int maxX;
    int y;
    int r, g, b;
    struct line *first;
} slide;

typedef struct line {
    char content[256]; // number subject to change
    int r, g, b;
    struct line *prev;
    struct line *next;
} line;

Создание экземпляров этих структур выполняется с помощью следующего кода:

slide* createSlideArray(int s) {
    slide* slides = malloc(sizeof(struct slide)*s);
    return slides;
}

line *nextLine(line *prev) {
    line *n = malloc(sizeof(line));
    n->prev = prev;
    prev->next = n;
    return n;
}

И, наконец, вот код для освобожденияструктуры после завершения цикла программы и перед открытием нового файла:

void freeLines(line *l) {
    line *next;
    while(l) {
        next = l->next;
        free(l);
        l = next;
    }
}

в основном:

int i;
for (i=0;i<slideCount;i++) {
    freeLines(slides[i].first); // works through next till NULL
}
free(slides);

Как видите, экземпляр структуры слайда содержит«первая» строковая структура, строковая структура представляет собой двусвязный список. Содержимое строки считывается на экран (с помощью ncurses)

Пока пользователь в цикле программы может набрать команду :open filename, чтобы открыть новый файл, в этом моя проблема.

Эти слайды и строки должны быть освобождены. Когда цикл начинается снова, он открывает новый файл, создает слайды и строки и использует их в качестве содержимого. Содержание, однако, частично заполнено мусорным текстом. Я почти уверен, что эта проблема в структуре строк и в том, как она бесплатна. Я не вижу, что я делаю неправильно, однако.

Редактировать: я должен прояснить, что на первой итерации программы текст идеален, только когда я пытаюсь проанализировать новый файл, появляется текст мусора, и он очень однороден (появляетсяв начале каждой строки одни и те же символы)

Я нахожусь на Ubuntu, если это имеет значение.

Вот ссылка на проект: DSS

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Мне удалось решить проблему, просто позвонив на memset. для строк я смог сделать следующее:

memset(l, 0, sizeof(*l));

Важно, чтобы вы получали размер значения в указателе l, а не размер самого указателяиначе вы не сможете правильно освободить память. Это была проблема, с которой я столкнулся.

0 голосов
/ 31 октября 2019

Есть некоторые явные проблемы, которые я могу заметить, прочитав код в вашем посте. Я не могу однозначно сказать, отвечают ли они за вашу проблему, поскольку код в вашем посте не является компилируемым примером, и я не стал углубляться в ваш связанный проект.

Ваша функция nextLine :

Вы забыли установить n-> next.

Вы также пренебрегали установкой указателя prev следующего узла, если он есть. (prev-> next-> prev if prev-> next! = NULL).

В текущем проекте запрещено использовать эту функцию для настройки первого узла в списке. Это также не показывает, как вы собираетесь создать этот узел.

Эта функция не позволяет добавлять узел в начало списка.

Ваша функция createSlideArray:

Эта функция не инициализируетсяслайды, которые он создает. Эти экземпляры слайдов должны быть инициализированы. Кажется разумным сделать это здесь, но у вас может быть веская причина сделать это в другом месте. В любом случае инициализация члена slideObject.first является критической. Без этого вы не сможете определить, есть ли на слайде список строк или нет, и ваша функция freeLines потерпит неудачу, поскольку в качестве параметра будет передан мусор.

Примечание:

Другим способом реализации двусвязных списков является использование «головного узла», который всегда присутствует и связывается с первым и последним узлом в списке. Это упрощает некоторые проблемы, но меняет другие. Вы можете исследовать это, если вам интересно.

...