我正在尝试使用 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;
}
最佳答案
您的代码正在泄漏内存,因为它使用 malloc()
分配列表,然后按值返回该结构的内容。
如果你想要一个按值返回空列表的函数,你应该这样做:
list llinit()
{
list ll;
ll.head = NULL;
ll.tail = NULL;
return ll;
}
以上很好,不存在由于超出范围而导致值“消失”的风险,这与例如返回本地 int
值的函数。返回的值(全部!)根据需要复制到调用者的内存中。
对于调用者来说,决定节点是否应该在堆上是微不足道的。
更新:Here is the code on ideone ,它确实编译并且不会为 main()
中的赋值生成错误。
关于c - C 错误中的链表 -- Invalid Initalizer 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209848/