[英]“use of undeclared identifier” when typecasting void pointer to struct pointer
我是C语言的新手,作为(经典)练习,我试图在链接列表上实现一些操作。 但是,我还没有走的很远...当我尝试如下声明和初始化根节点时:
#include <stdlib.h>
struct intNode_t {
int data;
struct intNode_t* next;
};
int main() {
struct intNode_t* root = ( intNode_t* ) malloc( sizeof( struct intNode_t ) );
return 0;
}
编译器(clang)在尝试将malloc返回的void指针转换为指向intNode_t的指针的地方,给我错误“使用未声明的标识符”。 我意识到这是一个菜鸟问题,但我找不到其他答案。 有什么建议么?
C中的结构名称与基本类型名称和typedef的名称空间无关(请参阅此问题以获取详细信息)。 因此,您的结构类型的名称为struct intNode_t
; 没有称为intNode_t
类型。
您可以始终将名称拼写为struct intNode_t
,也可以为其创建类型别名。 实际代码中有许多不同的模式:
单独的标签名称,单独的声明:
typedef struct foo_t_ foo_t;
struct foo_t_ { /* ... */ };
这样,您就可以将类型别名放在标头中,并将其发布为不透明的API类型,而无需透露实际的类型定义。
单独的标记名称,结构定义中的typedef:
typedef struct foo_t_ { /* ... */ } foo_t;
重用名称:
typedef struct foo_t { /* ... */ } foo_t;
这种样式使用户foo_t
担心拼写foo_t
或struct foo_t
。
不要命名结构:
typedef struct { /* ... */ } foo_t;
但是,在代码中,您实际上不需要重复名称,因为您不应该malloc
转换malloc
的结果,而是依靠从void指针到对象指针的内置隐式转换。 您也不应重复已知的类型,而应使用sizeof
的表达式形式。 所以你要:
int main()
{
struct intNode_t* root = malloc(sizeof *root);
}
(还要注意,从main
隐含return 0
)
无需重复自己。 如果您不重复自己,则可以减少错误。
struct intNode_t *root;
root = malloc( sizeof *root );
malloc()
返回一个void*
,它可以与每种(非函数)指针类型互换。 sizeof(type)
和sizeof expression
第一个需要()
,第二个不需要。 大多数人都喜欢第二种形式,因为表达式(在您的情况下为*root
)总是会产生正确的类型,因此:size。 并且,上面的定义+赋值可以组合为一个定义+初始化程序,所有这些都适合于一行:
struct intNode_t *root = malloc( sizeof *root );
intNode_t
中未声明名称intNode_t
。 声明了结构标签名称intNode_t
。
所以你需要写
struct intNode_t* root = ( struct intNode_t* ) malloc( sizeof( struct intNode_t ) );
或者您可以通过以下方式引入标识符名称intNode_t
typedef struct intNode_t {
int data;
struct intNode_t* next;
} intNode_t;
在这种情况下,您可以写
struct intNode_t* root = ( intNode_t* ) malloc( sizeof( struct intNode_t ) );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.