1

我正在尝试使用 C(不是 C++)创建链接列表。链接列表通过函数 llinit() 初始化,该函数应该返回一个列表结构。但是,当我编译代码时,我在 lltester.c 文件中收到一条错误消息,指出“错误:无效初始化程序”。为什么是这样?

这是用于在我的 llist.c 文件中初始化链表的函数:

list llinit()
{
    list* ll = malloc(sizeof(list));
    ll->head = NULL;
    ll->tail = NULL;
    return *ll;
}

这是我的 llist.h 文件中的列表结构:

typedef struct {
    node *head;
    node *tail;
} list;

这是我在 lltester.c 文件中尝试初始化列表的主要函数:

int main()
{
    list myList= llinit(); //This is the line where the error occurs on!

    return 0;
}
4

2 回答 2

7

您的代码正在泄漏内存,因为它分配列表,然后按 valuemalloc()返回该结构的内容。

如果你想要一个按值返回空列表的函数,你应该这样做:

list llinit()
{
    list ll;
    ll.head = NULL;
    ll.tail = NULL;

    return ll;
}

以上很好,没有由于超出范围而导致值“消失”的风险,这与例如返回本地int值的函数一样安全。返回(全部!)根据需要复制到调用者的内存中。

然后调用者决定节点是否应该在堆上是微不足道的。

更新这是 ideone 上的代码,它确实可以编译并且不会为中的赋值生成错误main()

于 2013-04-25T08:51:14.160 回答
0

您必须将结构声明为

typedef struct _list{
list* head;  /* could have been struct node* as well */
list* tail;

} 列表;

该列表也是您的自定义结构。并且 llPushBack() 不是您的结构的一部分。

于 2013-04-25T08:28:30.290 回答