我一直在和这个问题争斗几个小时。
我有一个双向链表实现,不需要动态内存分配。
这是插入方法。它会在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
结构,并将动态分配的元素传递到列表中吗?
如果是这样,我该如何动态分配结构?
答案 0 :(得分:1)
如果您需要动态分配结构实例,它就像MyStruct *p = malloc(sizeof(*p));
一样简单,然后在某个时刻关联free(p);
。