2017-01-21 45 views
3

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' 未申报(在一次使用此功能)


我在做什么错?

+2

在typedef后面隐藏指针语义是一个坏主意。 – StoryTeller

回答

2

在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类型。然后您的原始分配声明将起作用。

+0

太棒了!谢谢! –

1

您必须的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.

+0

用这个解决方案'typedef struct Foo_st * Foo;'会失败。你删除了'struct'标记,所以丑陋的指针typedef必须写成'typedef Foo_st * Foo;',如果有的话。 – chqrlie

+0

@chqrlie真的,更正了,谢谢。 – 4pie0

0

您的代码在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后面的指针。它倾向于容易出错,并为读者和程序员产生非惯用代码混淆。

相关问题