我正在尝试用 C 编写网络程序。我有相互链接的节点,我想通过使结构成员指向另一个成员(而不是另一个节点,因为我想保留链接的身份)。 我为此编写的代码是这样的:
struct node{
int k; //number of links
struct node.link **link; //<- wrong
};
但是这是不对的,因为节点不是变量而是变量的一种类型(这已经在另一个 QA 中被讨论为错误:首先你必须定义一个节点类型的变量然后应用 .link,但是这在这里没有帮助)。还有一个名为“Struct member point at another struct member”的 QA,但他们不是根据定义来做的,而且不太清楚如何概括它(至少对我而言)。
这样做是否正确?
最佳答案
问题在于 C 语言不允许您创建所需的类型。您需要具有属性 *T
的类型 T 与 T
具有相同的类型。你不能那样做。 (好吧,函数指针具有该属性,但这是无关紧要的技术问题。)
你得介绍一个新名字。 C 仅允许您使用结构或类似结构来执行此操作。
struct link {
struct link *ptr;
};
struct node {
int k;
struct link *link;
};
这会让你得到你想要的。现在,为了从 struct link *
到 struct node *
,您必须进行一些指针数学运算:
struct node *node_from_link(struct link *link) {
return (struct node *) ((char *) link - offsetof(struct node, link));
}
这也是由 container_of
宏提供的,它不是 C 标准的一部分,但您可以在网上找到它的定义。
或者,您也可以走传统路线。
// Usually easier to do it this way...
struct node {
int k;
struct node *link;
};
关于c - 定义一个结构,其中一个成员指向另一个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682473/