6

这可能真的很简单,但是我怎样才能让 struct x 在 C 中的 struct x 中呢?例如:

typedef struct _Node {
    Node node;
} Node;

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

typedef struct _Node {
    struct Node *node;
} Node;

尽管这将变量 node 作为一个指针,这是我不想要的,但我只是希望它成为 Node 结构的一个实例。谢谢你的帮助。:)

编辑:

基本上我想做的是:

Node current = createNode(...);
while (true) {
    Node node = createNode(..., &current);
    addToList(node);
    current = somethingElse();
}

正如您可能想象的那样,我想要一个常规节点进入 createNode() 函数:

Node createNode(..., Node node) {}
4

2 回答 2

8
typedef struct node {
    struct node node;
} node_s;

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

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

typedef struct node {
    struct node *node;
} node_s;

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

于 2013-06-08T09:16:05.850 回答
3

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

原因是这样的。

  1. 为了使字段位于结构内,它必须是已知类型。
  2. 但到我们看到struct Node里面的时候struct Node{},它还没有确定。
  3. 只有在扫描了 的所有定义后才能确定,struct Node{}但​​这只有在知道struct Node导致paradox.

但如果包含struct Node *.

  1. 当你到达 时struct Node *,你知道它是一个指针类型。无论指针的类型是什么,这都需要固定数量的存储空间。
  2. 因此,它成功扫描并完成了struct Node{}. 因此它是一个完整的类型。
于 2013-06-08T09:21:01.980 回答