c - 定义一个结构,其中一个成员指向另一个成员

标签 c pointers struct

我正在尝试用 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/

相关文章:

CC 编译没有得到我在代码中所做的更改

c - XDR 编码功能

c - Windows Shell 中的 ReadConsoleInput 缺少事件?

c - 更改数组数据的函数 - 数据不变。 C

c# - 检索结构体的 [StructLayout] 属性

c - 为 MicroChip 编译时出错 'invalid operands to binary =='

c++ - 在 C/C++ 中启用高对比度模式

c++ - 指向来自 C++ 中另一个文件的结构内部结构的指针

C++ 如何从函数传递两个结构?

c++ - 使用对象指针时访问冲突读取