Уничтожить деку с помощью указателей и бесплатно в 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()
строка, чтобы избежать путаницы и разделения значений визуально.