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!

但我个人觉得这种做法有点愚蠢:除非你想隐藏它是指针的事实,否则不要 typedef 指针。

于 2013-09-15T23:06:47.180 回答
1

你可能想要的是:

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

/*
 * This defines a structure named _node.
 * To use it, you must add struct everytime, for instance:
 * struct _node foo;
 *
 * It also defines a typedef named Node which is a synonym to struct _node - Node
 */ 

Node *n = malloc(sizeof(*n));
/*
 * Because we want to dynamically allocate we need a pointer, so we declared it as a Node *
 */
于 2013-09-15T23:03:17.603 回答