1

以下のように自己参照構造を宣言したい

    typedef struct
    {
            entry_t *entry;
            node_t *next;
    }node_t;

以下のリンクリストの代わりに

  struct node
  {
         entry_t *entry;
         struct node *next;
  }*head;

これはCで動作しますか? いいえの場合、なぜですか?

4

2 に答える 2

6

node_tの宣言ではシンボル/名前が不明であるため、機能しませんnext:

typedef struct
{
    entry_t *entry;
    node_t *next; /* <-- Error: unknown type */
} node_t;

構造体を「自己参照」にするためには、宣言に名前が必要です。ただし、typedef を保持できます。

typedef struct node
{
    entry_t *entry;
    struct node *next; /* <-- type struct node is known */
} node_t;

これで、struct nodeまたはnode_tを使用して新しいノードを作成できます。

于 2012-10-02T05:15:06.263 に答える
4

2回目に挙げたバージョンが広く使われており、typedefを次のように作ることができます

typedef struct some_struct_name {
    /* other fields, etc... */
    struct some_struct_name *next;
} *some_type;

構造自体を宣言するのと同じくらい早く、その型定義された名前が本当にひどく必要な場合は、不完全な型を使用して前方宣言を使用できます。

typedef struct node *node_t;

struct node {
    int data;
    node_t next;
};

これは C89 でも受け入れられます。

ここに画像の説明を入力

于 2012-10-02T05:16:10.443 に答える