我对 C 还很陌生,我一直在尝试使用这种数据结构编写一个程序:
struct node {
char command[100];
char prereq[100][80];
char *targ;
int isUpdated;
} Node;
但是,每当我尝试在代码中实现它时,如下所示:
Node n = malloc(sizeof(*n));
我收到编译器错误,例如“nmake.c:13:31:错误:未知类型名称‘Node’”。
我尝试过以下代码:
typedef struct node *Node;
有类似的结果。怎么了?
最佳答案
我认为您对 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 指针,除非你想隐藏它是指针的事实。
关于c - 无法让这个数据结构工作(新手),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18818304/