-2

私は持っている

   struct node
   {
        int value;
       struct node next;
   };

これを行うと、エラーが発生しますfield next has incomplete type

しかし、このような構造を宣言すると正常に動作し、

     struct node
     {
         int value;
         struct node *next;
     };

そのエラーはなぜですか?コンパイラは、構造体ノードが既に宣言されていることを知ることができます。

4

4 に答える 4

1

誰かが実際にあなたの質問に適切に答えたかどうかはわかりません。

いくつかの理由から、構造自体を使用することはできません。1 つ目は、構造体を自己参照型にしたため、実際に十分なスペースを割り当てる方法がないことです。それを割り当てようとするたびに、それ自体の1つが含まれ、それ自体の1つが含まれ、さらにそれ自体の1つが含まれます...永遠に。したがって、無限のメモリが必要になります。第 2 に、コンパイラは、構造体がまだ完成していないため、そのタイプの構造体であることが何を意味するのかをまだ知りません。

ただし、コンパイラは、その構造体へのポインターがどれだけのスペースを占めるかを正確に認識しています。これは、他の型へのポインターと同じです。

また、構造体自体のメモリは割り当てられていないため (ポインタのみ)、無限再帰はありません。

また、ポインターを追加することによって逆参照が行われないため、構造体のメンバーにアクセスするために移動するメモリ オフセットを知るために、まだ構造体の完全な定義を持っている必要はありません。構造が完全に定義されるまで待つ必要があります。

于 2013-06-07T10:02:52.833 に答える
1

これしかできない

struct node
{
  int value;
  struct node *next;
};

よろしく、 ルカ

于 2013-06-07T09:04:49.823 に答える
0

do not use struct キーワードの typedef を追加できますが、ポインターが必要です。

typedef struct node node;

struct node
{
   int value;
   node *next;
};
于 2013-06-07T09:07:48.330 に答える