【问题标题】:Linked List in C error -- Invalid Initalizer errorC 中的链表错误——Invalid Initalizer 错误
【发布时间】:2013-04-19 01:23:53
【问题描述】:

我正在尝试使用 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;
}

【问题讨论】:

  • llinit 函数做了不必要的堆分配并泄漏了指针。
  • @Medinoc,除非他突然将数据引入struct list
  • @Medinoc,如何在不泄露指针的情况下创建列表结构?
  • 请提供 SSCCE (sscce.org) ... 否则我们就是在黑暗中刺伤。
  • 什么是myList.llPushBack?你用什么语言写作? C 没有成员函数。

标签: c list struct initializer


【解决方案1】:

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

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

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

    return ll;
}

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

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

更新Here is the code on ideone,它确实可以编译并且不会为main() 中的赋值生成错误。

【讨论】:

  • 这正是我现在所拥有的,它仍然抛出相同的错误说明:“错误:无效初始化程序”。此错误与上述代码位于同一行。
  • @BenBeck 没有人可以帮助你,因为你还没有发布完整的程序,也没有提到你的编译器和选项。
  • 作为该解决方案的一个额外优势,这里不涉及动态内存分配,这意味着无需进行错误检查,也无需从调用者返回错误代码。
  • @BenBeck 对不起,我不太相信你。我添加了一个指向ideone的链接,你自己看看。它编译。
  • @BenBeck 您使用的是哪个编译器?
【解决方案2】:

你必须将结构声明为

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

} 列表;

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

【讨论】:

  • 我认为这行不通。 typedef 直到分号才生效,所以list 是一个未定义的类型。 OP 必须在别处定义 node
  • 另外,您的答案假设列表节点是一个列表,这正是我的书中 not 做链表的方式。它会引起混乱。
  • 定义自引用结构类型的正确方法是typedef struct list list; struct list { ...};
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多