C typedef结构声明返回一个错误

C typedef结构声明返回一个错误,c,C,我不明白下面的代码有什么问题。我试图用C语言创建一个链表。我创建了一个名为person的typedef结构,然后我声明了一个指向该结构的指针,我试图为它分配一些内存,以便能够存储它的所有组件。编译器返回一个错误,指出“head”没有命名类型 typedef struct node { int num; struct node *next; } person; person *head = NULL; head = (person*)malloc(sizeof(node));

我不明白下面的代码有什么问题。我试图用C语言创建一个链表。我创建了一个名为person的typedef结构,然后我声明了一个指向该结构的指针,我试图为它分配一些内存,以便能够存储它的所有组件。编译器返回一个错误,指出“head”没有命名类型

typedef struct node {
    int num;
    struct node *next;
} person;

person *head = NULL;
head = (person*)malloc(sizeof(node));

假设头的赋值在函数中,它仍然不正确,因为
节点
不是有效的类型或变量。它或者是
struct节点
,但是当您使用
typedef
'd时,您应该使用
person

head = malloc(sizeof(person));
但是由于变量
head
已经是
person*
类型,您也可以这样做

head = malloc(sizeof(*head));
这样做的好处是,您不再需要知道确切的类型名称(如果您曾经更改过它)

还请注意,不需要也不需要强制转换
malloc
的结果


但是,您必须检查结果是否为空。

您不能在文件范围中包含对
头的赋值。如果您的代码不在文件范围内,则说明您没有向我们显示MCVE(-或MRE或现在使用的任何名称)或SSCCE()。使用不同的名称会导致混淆。您应该使用
typedef结构节点{}节点
typedef结构人{}人@Gerhardh我们似乎有不同的看法。我的观点是,用同一个名字来表示不同的事物是令人困惑的。在本例中,存在结构标记
节点
,它仅与
struct
组合构成一个类型。还有typedefed type
person
。我最喜欢使用不同但明显相关的相似名称。与非常详细的
struct person_标记
(可以在
struct
中使用)类似,它可以明显地与类型
person
相关(不能)。那么意见分歧,;编译器也不介意。@Yunnosch,非常正确。我更新了答案。:-)现在得到了我的支持票。请随意添加关于我的评论中的struct标记是什么的讨论。