Сохранение структур без динамического выделения - PullRequest
0 голосов
/ 26 марта 2012

Я боролся с этой проблемой в течение нескольких часов.

У меня есть реализация двусвязного списка, которая не требует динамического выделения памяти.

Вот метод вставки. Он вставляет elem прямо перед before. У struct list есть два члена, struct list_elem *next и struct list_elem *prev. list_elem - это структура, которая содержит некоторые данные. Обратите внимание, что реализация этого списка верна. Проблема в том, как я это использую. Пожалуйста, продолжайте читать.

void list_insert(struct list_elem *before, struct list_elem *elem) {
    /* "before" has to be an interior node or tail node to be able to insert "before" it */
    assert (is_interior(before) || is_tail(before));
    assert (elem != NULL);
    elem->prev = before->prev;
    elem->next = before;
    before->prev->next = elem;
    before-> = elem;
}

Способ инициализации этого списка следующий:

void list_init(struct list *list) {
    assert(list != NULL);
    list->head.prev = NULL;
    list->head.next = &list->tail;
    list->tail.prev = &list->head;
    list->tail.next = NULL;
}

Мой основной класс выполняет следующее:

struct list some_list;
static struct list_elem head;
some_list.head = head;
static struct list_elem tail;
some_list.tail = tail.
list_init(&some_list);

Это в основном создает два статических list_elem structs, head и tail. И передает его в функцию инициализации, которая соединит их вместе.

Теперь, чтобы создать элемент, я делаю следующее - вот что я делаю неправильно

struct list_elem element_struct;
/* Initialize element_struct members here */
struct list_elem *data = &element_struct;
list_insert( list_begin(some_list), data);

Теперь это работает, чтобы вставить один элемент. Поскольку some_list.head будет указывать на data, что будет указывать на some_list.tail. Моя проблема в том, что я делаю это в цикле. Таким образом, как любой список, он будет вводить несколько данных там. Я либо получаю segfault, либо какую-то другую ошибку, в которой говорится, что мой элемент не является внутренним или хвостовым узлом (из-за assert), поскольку на каждой итерации цикла структура данных element_struct будет повторно инициализирована. (list_elem содержит указатели друг на друга).

Итак, мой вопрос, как бы я сохранил вставленные узлы? В списке не предполагается использовать какое-либо динамическое распределение. В таком случае, буду ли я динамически распределять свои list_elem структуры и передавать динамически размещенный элемент в список?

Если так, как я могу динамически распределить структуру?

1 Ответ

1 голос
/ 26 марта 2012

Если вам нужно динамически выделить экземпляр структуры, это так же просто, как MyStruct *p = malloc(sizeof(*p));, а затем связанный free(p); в некоторый момент.

...