C错误中的链接列表 - Initalizer错误无效

Ben*_*eck 1 c struct list initializer

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

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

list llinit()
{
    list* ll = malloc(sizeof(list));
    ll->head = NULL;
    ll->tail = NULL;
    return *ll;
}
Run Code Online (Sandbox Code Playgroud)

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

typedef struct {
    node *head;
    node *tail;
} list;
Run Code Online (Sandbox Code Playgroud)

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 7

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

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

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

    return ll;
}
Run Code Online (Sandbox Code Playgroud)

以上情况很好,由于超出范围,因此没有价值"消失"的风险,这与返回本地int值的函数一样安全.根据需要将返回(全部!)复制到调用者的内存中.

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

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

  • @BenBeck对不起,我不太相信你.我添加了一个ideone的链接,看看你自己.它汇编. (3认同)