2

私はCにかなり慣れていないので、このデータ構造でプログラムを作成しようとしています:

struct node {
    char command[100];
    char prereq[100][80];
    char *targ;
    int isUpdated;
} Node;

ただし、コードに実装しようとすると、次のようになります。

Node n = malloc(sizeof(*n));

「nmake.c:13:31: error: unknown type name 'Node'」などのコンパイラ エラーが発生します。

次のようなコードを試しました:

typedef struct node *Node;

同様の結果が得られます。どうしたの?

4

2 に答える 2

2

私はあなたが何をするかについて混乱していると思います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!

しかし、個人的には、この慣行は少しばかげていると思います。ポインターであるという事実を隠したい場合を除き、ポインターを型定義しないでください。

于 2013-09-15T23:06:47.180 に答える