我正在尝试使用C(NOT 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;
}
答案 0 :(得分:7)
您的代码正在泄漏内存,因为它正在使用malloc()
分配列表,然后按值返回该结构的内容。
如果你想拥有一个按值返回空列表的函数,你应该这样做:
list llinit()
{
list ll;
ll.head = NULL;
ll.tail = NULL;
return ll;
}
以上情况很好,由于超出范围,因此没有价值“消失”的风险,这与例如安全性一样安全。返回本地int
值的函数。返回值(全部!)会根据需要复制到调用者的内存中。
然后,调用者决定该节点是否应该在堆上,这是微不足道的。
更新:Here is the code on ideone,它确实可以编译,并且不会为main()
中的作业生成错误。
答案 1 :(得分:0)
你必须将结构声明为
typedef struct _list{
list* head; /* could have been struct node* as well */
list* tail;
} list;
此外,列表是您的自定义结构。并且llPushBack()不是你结构的琥珀。