Struct X in Struct X?
这可能真的很简单,但是如何在C中将struct x放入struct x中呢?因此,例如:
1 2 3
| typedef struct _Node {
Node node;
} Node; |
我已经做了一些研究,并尝试使用指针,例如:
1 2 3
| typedef struct _Node {
struct Node *node;
} Node; |
尽管我不需要变量节点作为指针,但我只是希望它成为Node结构的实例。谢谢你的帮助。 :)
编辑:
基本上我想做的是:
1 2 3 4 5 6
| Node current = createNode(...);
while (true) {
Node node = createNode(..., ¤t);
addToList(node);
current = somethingElse();
} |
您可能会想像,我希望常规节点进入createNode()函数:
1
| Node createNode(..., Node node) {} |
- 你不能那样做。要了解递归,您必须首先了解递归。
-
@DCoder那么理想的解决方法是什么?
-
使用指针,就像您在研究中发现的一样
-
如果类型Node的变量包含名为Node的类型Node的成员,则该成员也包含名为Node的类型Node的成员...将会有无限的链。而且由于那里什么也没有,因此您无法使用此变量执行任何操作,而是无穷远地追踪无限链。
-
有关的
-
@TomerArazy如果使用指针,这是否意味着将使用它指向的变量实例而不是副本?因此,如果我更改了它所指向的变量,指针也不会改变吗?我该如何解决?
-
现在您已经接近一个实际的问题,但这没有多大意义。显示一个使用带有指针的结构的示例,并解释您希望它执行的操作以及该方法无法执行的操作,那么也许有人可以提供帮助。
-
@ WumpusQ.Wumbley我用一个例子编辑了这个问题。 :)
-
在C中,@MrCherno可以使用副本构造函数非常强大地解决。这样,您就可以指定在创建对象副本时应该发生的情况(在这种情况下,大概也要复制指向的对象)。在C语言中,您必须手动执行此操作。每当复制Node时,都要编写其他代码来修复其内部。
-
我认为您真正想要的是类似链表的东西。仔细阅读并阅读,可能会找到答案:cprogramming.com/tutorial/c/lesson15.html
-
createNode肯定看起来像是它正在尝试分配新节点并将其追加或添加到链表中。但是我们那里只有程序的一部分,没有一个实际的程序,它具有所需的输出和可以比较的实际输出。
1 2 3
| typedef struct node {
struct node node;
} node_s; |
这将导致"无限递归"。换句话说,它的大小将是无限的。编译器无法回答这个问题:要分配多少内存?因此,它将引发诊断消息。
这就是为什么必须使用指针创建自引用类型的原因。
1 2 3
| typedef struct node {
struct node *node;
} node_s; |
顺便说一下,标识符以下划线开头,然后是下划线或大写字母,将保留给实现。
那是不可能的。因为那属于不完整的类型。在struct Node内的struct Node内没有struct Node ...以此类推....这会使您的原始结构不完整。因此类型定义不完整。
原因是。
为了使字段位于结构内部,它必须是已知类型。
但是,当我们看到struct Node{}内部的struct Node时,尚未
仅在扫描struct Node{}的所有定义之后才能确定,但??是只有在知道导致paradox的内部struct Node的类型之后才有可能。
但是如果包含struct Node *,情况会有所不同。
当您到达struct Node *时,您就知道它是指针类型。无论指针的类型是什么,都需要固定的存储量。
因此,它成功扫描了该文件并完成了struct Node{}的定义。因此,它是一个完整的类型。