C 结构声明

C 结构声明,c,struct,structure,C,Struct,Structure,我在C语言中声明结构时遇到问题。 我需要创建一个具有ConnectionNode和connection node数组的NetworkNode,您知道这会导致错误: 错误:“目标”字段的类型不完整 struct NetworkNode; struct ConnectionNode { char* name; //pointer 2 bytes struct NetworkNode *target; //pointer 2 byte

我在C语言中声明结构时遇到问题。 我需要创建一个具有ConnectionNode和connection node数组的NetworkNode,您知道这会导致错误:

错误:“目标”字段的类型不完整

struct NetworkNode;
struct ConnectionNode
{
    char* name;                      //pointer 2 bytes
    struct NetworkNode *target;      //pointer 2 bytes
};                                  //total 4 bytes reserved
这个问题的解决方案是什么

顺便说一句,代码如下:

struct ConnectionNode
{
    char* name;
    struct NetworkNode target;
};

typedef struct ConnectionNode ConnectionObject;

struct NetworkNode
{
    char* name;
    int i;
    struct ConnectionNode connections[10];
};

typedef struct NetworkNode NetworkObject;

在程序的最开始部分,为
NetworkNode
添加前向声明:

struct NetworkNode;
这使编译器能够理解什么是
NetworkNode
,并打破在
ConnectionNode
定义中需要提及的第22条军规,反之亦然

更新: 此外,您还需要更改ConnectionNode的定义:

...
struct NetworkNode target;
...
要改用指针,请执行以下操作:

struct NetworkNode *target;

若并没有这一点,编译器将不知道要为NetworkNode分配多少内存(即使使用前向声明)。另一方面,指针总是具有相同的大小。

我不确定,但尝试在这里使用指针,并通过在使用之前声明结构来进行前向引用。将指针添加到结构
NetworkNode
(例如*target),以便编译器为引用
NetworkNode
结构的指针保留2字节的内存。但当您声明
struct NetworkNode target
时,编译器不知道其大小,并抛出错误“complete type”

当你喜欢的时候

struct NetworkNode;
struct ConnectionNode
{
    char* name;                      //pointer 2 bytes
    struct NetworkNode target;       //unknown size of target as it is not YET defined
};                                  //total size: unknown (error: incomplete type)
如果你打字

struct NetworkNode target;
编译器必须知道结构的大小,才能为目标分配足够的内存

通常人们会使用

struct NetworkNode *target;
引用另一个对象(使用单独的malloc),这可以作为转发声明来完成

您的申报存在以下问题:

struct ConnectionNode {
  struct NetworkNode target;
}
struct NetworkNode {
  struct ConnectionNode connection;
}

编译器无法计算struct NetworkNode类型的一个对象的大小。

我刚才这样做了,但这不是解决方案。我仍然有错误。他没有使用指针@彼得米尔:是的,你说得对-谢谢!我更新了我的答案,提到了这一点。我试图避免使用指针,但这似乎是不可能的。无论如何,在改变指针的类型和修复我的一些函数之后,一切都正常了!感谢开头的帮助
typedef struct NetworkNode NetworkObject
。然后稍后声明该结构。您可能需要查看:[转发声明C struct][1][1]: