【问题标题】:Struct X in Struct X?结构 X 中的结构 X?
【发布时间】:2013-06-08 09:12:00
【问题描述】:

这可能真的很简单,但是我怎样才能让 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) {}

【问题讨论】:

  • 你不能那样做。要了解递归,首先要了解递归。
  • @DCoder 那么理想的解决方法是什么?
  • 使用指针,就像你在研究中发现的那样
  • 如果Node 类型的变量包含Node 类型的成员node,那么该成员还包含Node 类型的成员node...成为他们的无限链。而且由于那里没有其他任何东西,你不能对这个变量做任何事情,只能跟随无限链到任何地方。

标签: c recursion struct


【解决方案1】:
typedef struct node {
    struct node node;
} node_s;

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

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

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

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

【讨论】:

    【解决方案2】:

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

    原因是这样的。

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多