当结构体节点尚未定义时,C/CPP 如何知道如何指向“下一个”结构体节点? [重复]

问题描述 投票:0回答:2

创建单链表时,通常创建 Node 结构,如下所示:

struct node { 
    int data; 
    struct node *next; 
} 

但是,我想知道如果

next
的定义还没有完成,指向下一个节点
node
的指针如何知道
node
是什么结构。

我从quora读到编译器无法编译以下内容:

struct node { 
    int data; 
    struct node next; 
}; 

出现以下错误:

a.c:6:13: error: field has incomplete type 'struct node' 
struct node next; 
            ^ 
a.c:4:8: note: definition of 'struct node' is not complete until the closing '}' 
struct node { 
       ^ 
1 error generated. 

如果在使用'}'之前没有完成

node
结构体的定义,那我们怎么可以将指针设置为未定义的用户定义数据类型
node

c++ c struct linked-list
2个回答
5
投票

它不需要知道。指针只是一个地址。在您的结构中,当您定义下一个属性时,编译器将在结构内保留足够的空间来保留地址。它不需要知道完整的结构。

这个:

struct node { 
    int data; 
    struct node next; 
};

无法编译,因为编译器无法确定节点结构的大小。结构体的大小等于结构体的大小加上 int 的大小。


2
投票

因为

next
是指向 node
指针
,因此类型不需要完整即可编译成功。

还考虑一个 C++ 中的简单示例。

A
的类型不需要完整即可在 struct
B
中拥有指向它的指针。准备好看到此模式用于解决循环依赖关系。

struct A;

struct B {
    A *c;
};

struct A {
    B *d;
};

请注意,C 和 C++ 是两种不同的编程语言,虽然特定的 C 代码块可能是有效的 C++,但不能保证它将会,甚至如果是的话,它的行为也会与完全相同的语义。

© www.soinside.com 2019 - 2024. All rights reserved.