首页 文章

在没有动态分配的情况下保留结构

提问于
浏览
0

我一直在和这个问题争斗几个小时 .

我有一个双向链表实现,不需要动态内存分配 .

这是插入方法 . 它在 before 之前插入 elem . struct list 有两个成员, struct list_elem *nextstruct 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 structsheadtail . 并将其传递给初始化函数,该函数将它们连接在一起 .

现在要创建一个元素,我执行以下操作 - here's what I am doing wrong

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

    如果需要动态分配结构实例,它就像 MyStruct *p = malloc(sizeof(*p)); 一样简单,然后在某个时刻关联 free(p); .

相关问题