6

これはおそらく非常に単純ですが、構造体 x を C の構造体 x に入れるにはどうすればよいですか? たとえば、次のようになります。

typedef struct _Node {
    Node node;
} Node;

私はいくつかの調査を行い、次のようにポインターを使用してみました:

typedef struct _Node {
    struct Node *node;
} Node;

これにより、変数ノードがポインターとして残りますが、これは望ましくありませんが、それを Node 構造体のインスタンスにしたいだけです。助けてくれてありがとう。:)

編集:

基本的に私がやろうとしていることは次のとおりです。

Node current = createNode(...);
while (true) {
    Node node = createNode(..., &current);
    addToList(node);
    current = somethingElse();
}

おそらく想像できると思いますが、通常のノードを createNode() 関数に入れたいと思います。

Node createNode(..., Node node) {}
4

2 に答える 2

8
typedef struct node {
    struct node node;
} node_s;

これは「無限再帰」につながります。つまり、そのサイズは無限大です。コンパイラーは、この質問に答えることができません:どのくらいのメモリーを割り当てるか? したがって、診断メッセージがスローされます。

そのため、ポインターを使用して自己参照型を作成する必要があります。

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

ちなみに、アンダースコアで始まり、アンダースコアまたは大文字が続く識別子は、実装用に予約されています。

于 2013-06-08T09:16:05.850 に答える
3

それは不可能です。それは不完全なタイプに入るからです。struct Node内側struct Nodeがないstruct Node...など....それはあなたの元の構造を不完全にします。したがって、型定義が不完全です。

理由はそれです。

  1. フィールドが構造内にあるためには、既知の型である必要があります。
  2. しかし、私たちがstruct Node内部を見るstruct Node{}までには、まだ決定されていません。
  3. のすべての定義をスキャンした後にのみ決定されますが、それは につながる内部struct Node{}のタイプを知った後にのみ可能です。struct Nodeparadox

ただし、 を含める場合は異なりますstruct Node *

  1. に到達するstruct Node *と、それがポインター型であることがわかります。ポインタのタイプに関係なく、一定量のストレージが必要です。
  2. そのため、スキャンに成功し、 の定義を終了しますstruct Node{}。したがって、それは完全なタイプです。
于 2013-06-08T09:21:01.980 に答える