在C how-to和use-case中转发struct的结构

时间:2018-03-24 18:20:32

标签: c

我正在研究struct和网络上的某个地方我看过“循环struct”的例子。我有三个问题(基于以下代码):

struct A {
    struct B* b; //does not work if it is not a pointer
    int data;
};

struct B {
    struct A* a; //does not work if it is not a pointer
    int data;
};

int main(void)
{
    struct A sA;
    struct B sB;

    sA.b = &sB;
    sB.a = &sA;

    sA.b->data = 1;
    sB.a->data = 2;

    printf("a = %d, b = %d", sA.b->data, sB.a->data);
}

1)为什么struct成员是指针?不作为指针,它不会编译。

2)我是否正确声明并使用了struct

3)我不知道这种习语的潜在用例是什么。你能给我一些例子吗?

3 个答案:

答案 0 :(得分:2)

  

为什么内部结构应该是一个指针,没有指针它不能编译。

编译器需要知道数据类型的大小,并根据其成员的大小来计算。它知道指向moment("2010-01-01T05:06:07").format('x');的指针的大小,即使它还没有看到struct,但它不知道{{1}的大小本身。

  

我是否宣布并正确使用了结构?

乍一看看起来很好看。你编译了吗?您的代码是否按预期运行了?

  

我不知道这种习语的潜在用例是什么。你能给我一些例子吗?

链接列表是最简单且最常见的示例(struct包含指向同一类型的struct的指针。

答案 1 :(得分:1)

将结构视为网页,并将您在其中声明的指针视为该网页上的链接。用值替换指针与复制整个辅助链接网页并将其粘贴到主网页中的链接所在的位置相同。

如果第二个网页中还有一个指向第一个网页的链接,那么在复制/粘贴后,您将有一个链接到自身的文档。

现在,如果您考虑使用" ego" -pointing link再次执行相同操作(复制/粘贴),则必须将网页粘贴到自身的副本中,但您永远不会消除后向链接,因为每个副本都会出现一个此链接。并且,文档会爆炸到无限大小。

对于C编译器而言,将值周期性地保留在自身中是没有意义的,因为这会在程序开始时消耗所有内存。

如果你把指针留给指针,那就没有任何问题,就像两个网页相互来回链接一样。

答案 2 :(得分:1)

你在这里有双向关系。你经常会看到这样的东西,例如树;也许一个结构是父母,另一个结构是孩子。父项具有指向其每个子项的指针,而子项具有指向父项的指针。那他们为什么需要成为指针呢?想一想;如果你没有使用指针,那么struct A基本上需要包含struct B的整个副本,而这些字段的目的实际上是定义关系