私はあなたが何をするかについて混乱していると思いますtypedef
。
次のような宣言:
struct node { ... };
という名前の型を定義しますstruct node
。という言葉を忘れないでくださいstruct
!ただ言っnode
ても意味がありません (C++ では異なることに注意してください)。
したがって、ローカル変数を作成するには、次のようにします。
struct node x;
そして、動的なものを行うには:
struct node *px = malloc(sizeof(struct node));
ここで、型のエイリアスを作成する場合は、変数を作成する場合とまったく同じ構文を使用しますがtypedef
、宣言の先頭に次のように記述します。
typedef struct node Node;
または、ポインタ型を好む場合:
typedef struct node *PNode;
次に、変数を作成します。
Node a;
Node *b = malloc(sizeof(Node));
PNode c = malloc(sizeof(Node)); //do not use sizeof(PNode) as it is useless here
@WhozCraig がコメントで述べているように、元のコードsizeof
でタイプの代わりに宣言変数を使用することを意図しているように見える人もいます。
Node *b = malloc(sizeof(*b));
PNode c = malloc(sizeof(*c));
スタイル以外は大きな違いはありませんので、お好きな方をお選びください!
元の構造体を定義する場合、同じ宣言を使用して変数または typedef を作成できますが、両方を作成することはできません。
struct node { ... } a; //a is a variable
typedef struct node {...} b; //b is a type
一部の人々は、構文を強制して次のようにすることを好みます。
typedef struct node {...} Node, *PNode; //tree types in one line!
しかし、個人的には、この慣行は少しばかげていると思います。ポインターであるという事実を隠したい場合を除き、ポインターを型定義しないでください。