foo.h中,我有:内存分配到一个结构的指针
struct Foo_st {
int a;
MyObj obj1, obj2;
};
typedef struct Foo_st* Foo;
而且里面foo.c
我想为我的struct
分配空间,所以我尝试:
Foo foo1 = (Foo) malloc(sizeof(Foo_st));
但我得到一个错误 -
'Foo_st' 未申报(在一次使用此功能)
我在做什么错?
foo.h中,我有:内存分配到一个结构的指针
struct Foo_st {
int a;
MyObj obj1, obj2;
};
typedef struct Foo_st* Foo;
而且里面foo.c
我想为我的struct
分配空间,所以我尝试:
Foo foo1 = (Foo) malloc(sizeof(Foo_st));
但我得到一个错误 -
'Foo_st' 未申报(在一次使用此功能)
我在做什么错?
在C中,结构名称前必须有struct
。你想:
Foo foo1 = malloc(sizeof(struct Foo_st));
或者,一个typedef替换你struct Foo_st
声明:
typedef struct {
int a;
MyObj obj1, obj2;
} Foo_st;
这Foo_st
定义为一个别名匿名struct
类型。然后您的原始分配声明将起作用。
太棒了!谢谢! –
您必须的typedefstruct
能够使用它没有struct
关键字,就像你通过typedef指针那样:
typedef struct {
int a;
MyObj obj1, obj2;
} Foo_st;
typedef Foo_st* Foo;
// note: ^^^^^^^^ there is no struct keyword as Foo_st is already
// a typedef for struct, i.e. struct Foo_st
Foo foo1 = malloc(sizeof(Foo_st));
注:有没有必要投中的malloc C.
您的代码在C中失败,因为没有定义类型Foo_st
(与C++相反)。
您可以在3种不同的方式解决这个:
添加struct
关键字:
Foo foo1 = malloc(sizeof(struct Foo_st));
定义类型Foo_st
:
typedef struct Foo_st {
int a;
MyObj obj1, obj2;
} Foo_st;
typedef struct Foo_st *Foo;
Foo foo1 = malloc(sizeof(Foo_st));
使用的类型目标指针(一个更安全的选项IM HO):
Foo foo1 = malloc(sizeof(*foo1));
注意,它被认为是不好的风格隐藏的typedef后面的指针。它倾向于容易出错,并为读者和程序员产生非惯用代码混淆。
在typedef后面隐藏指针语义是一个坏主意。 – StoryTeller