Уничтожить деку с помощью указателей и бесплатно в C

Я пытаюсь уничтожить свою деку, но почему-то не получаю указатели. Я написал следующий код (deque это указатель на указатель, который указывает на первый элемент deque). DequeItem - это структуры с полями next (указатель на следующий элемент) и data (void *).

void deque_destroy(DequeItem **deque) {
    DequeItem *temp;
    DequeItem *item;
    for (item = *deque; item != NULL; item = temp) {
        printf("%d", *((int*)((item)->data)));
        temp = item->next;
        free(item);
    }
}

Объявление структуры:

struct DequeItem {
  void *data;                  // Data stored in the deque item

  struct DequeItem *previous;  // Pointer to the previous DequeItem in the ring
  struct DequeItem *next;      // Pointer to the next DequeItem in the ring
};

typedef struct DequeItem DequeItem;

2 ответа

Решение

Проблема заключалась в том, что следующий указатель последнего элемента (задний элемент) в deque будет указывать на первый элемент (передний элемент), даже если первый элемент был уничтожен. Я исправил это, установив

(*deque)->previous->next = NULL

до цикла выше. Спасибо за помощь!

Выглядит правильно, хорошо сделано, чтобы прочитать temp прежде чем позвонить free() на предмете, это распространенная ошибка новичка, которую вы избежали.

Я думаю, что вам нужно предоставить больше информации о том, что идет не так, и, возможно, также объявления структуры.

Это data член также динамически выделяется память? Если это так, вам может понадобиться free(item->data); вызов, также в зависимости от того, как он был выделен при создании элемента.

Как отметили комментаторы, ваш data указатель может быть NULL поэтому вы должны проверить это перед печатью:

if(item->data != NULL)
  printf("%d\n", *(int *) item->data);

Замечания:

  • Упрощение выражения приведения облегчает чтение.
  • Включить перевод строки ('\n') в printf() строка, чтобы избежать путаницы и разделения значений визуально.
Другие вопросы по тегам