gpt4 book ai didi

c - 为什么我的结构必须声明为指针?

转载 作者:行者123 更新时间:2023-12-02 08:19:53 26 4
gpt4 key购买 nike

我正在学习如何创建头文件和分离实现,同时也开始学习如何创建链表。我创建了 linked_list.hlinked_list.cmain.c 文件。在 main.c 中,我在尝试创建我键入定义的结构时遇到错误,除非我将其创建为指针,然后它才能工作。我不明白这是为什么,有人可以解释一下吗?

linked_list.h:

#ifndef LINKED_LIST_H_
#define LINKED_LIST_H_

typedef struct ListNode_ ListNode;

#endif // LINKED_LIST_H_

linked_list.c:

#include <stdio.h>
#include <stdlib.h>
#include "linked_list.h"

struct ListNode_ {
int data;
ListNode *next;
};

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "linked_list.h"

int main() {

ListNode node1; // why can't I do this?
ListNode *node2; // but this works
}

最佳答案

这是因为尽管 ListNode 和 ListNode_ 都已声明,但只定义了 ListNode_。编译器不知道 ListNode 对象可以包含什么或做什么。

是的,您可以拥有指向 ListNode 的指针。但是,您不能使用它们。尝试输入

//ListNode node1; // why can't I do this?
ListNode *node2; // but this works
node2->foo();

并且您将收到关于不完整类型的相同编译错误消息。只需将指针存储在某处就可以了,因为它毕竟只是一个地址,程序只需要知道它指向什么即可。

是的,您没有使用 node1,但它仍然会给您一个错误。为什么?因为程序会自动为 node1 分配空间,而它不知道该空间应该是多少。更不用说它应该自动调用它的构造函数,这又是未定义的。

这也是这里的原因

struct ListNode_ {
int data;
ListNode *next;
};

您可以拥有该指针。

我忽略了文件甚至没有正确链接的事实,因为评论中讨论了这一点,但它与这个问题无关。

关于c - 为什么我的结构必须声明为指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com