结构X中的结构X?

Mr *_*rno 6 c recursion struct

这可能很简单,但是如何在C中的struct x中得到一个struct x?例如:

typedef struct _Node {
    Node node;
} Node;
Run Code Online (Sandbox Code Playgroud)

我做了一些研究并尝试使用指针,如下所示:

typedef struct _Node {
    struct Node *node;
} Node;
Run Code Online (Sandbox Code Playgroud)

虽然这会将变量节点作为指针(我不想要),但我只想让它成为Node结构的一个实例.谢谢你的帮助.:)

编辑:

基本上我要做的是:

Node current = createNode(...);
while (true) {
    Node node = createNode(..., &current);
    addToList(node);
    current = somethingElse();
}
Run Code Online (Sandbox Code Playgroud)

你可以想象,我想要一个常规节点进入createNode()函数:

Node createNode(..., Node node) {}
Run Code Online (Sandbox Code Playgroud)

md5*_*md5 8

typedef struct node {
    struct node node;
} node_s;
Run Code Online (Sandbox Code Playgroud)

这将导致"无限递归".换句话说,它的大小将是无限的.编译器无法回答这个问题:要分配多少内存?因此它会抛出一条诊断信息.

这就是为什么你必须使用指针来创建自引用类型.

typedef struct node {
    struct node *node;
} node_s;
Run Code Online (Sandbox Code Playgroud)

顺便说一下,以下划线后跟下划线或大写字母开头的标识符保留给实现.


pin*_*her 3

那是不可能的。因为那属于不完整类型。struct Node里面没有struct Node里面struct Node……等等……这使得你原来的结构不完整。因此类型定义不完整。

原因是这样的。

  1. 为了使字段位于结构内部,它必须是已知类型。
  2. struct Node但当我们看到内部时,struct Node{}情况尚未确定。
  3. 它只有在扫描了 的所有定义之后才能确定,但​​这只有在知道导致 的内部struct Node{}类型之后才有可能。struct Nodeparadox

但如果包含 的话,情况就不同了struct Node *

  1. 当你到达 时struct Node *,你知道它是一个指针类型。无论指针是什么类型,都需要固定数量的存储空间。
  2. 因此,它成功地扫描了它并完成了 的定义struct Node{}。因此它是一个完整的类型。