使用指针分配给结构的内存

时间:2017-01-21 12:41:23

标签: c

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


我做错了什么?

3 个答案:

答案 0 :(得分:2)

在C中,结构名称必须以struct开头。你想要:

Foo foo1 = malloc(sizeof(struct Foo_st));

或者,将您的struct Foo_st声明替换为typedef:

typedef struct {
    int a;
    MyObj obj1, obj2;
} Foo_st;

这将Foo_st定义为匿名struct类型的别名。然后,您的原始分配声明将起作用。

答案 1 :(得分:1)

您必须 typedef struct才能使用struct关键字,就像使用typedefed指针一样:

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));

注意:无需在C中投射malloc。

答案 2 :(得分: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));
    
  • 使用目标指针的类型(更安全的选项IMHO):

    Foo foo1 = malloc(sizeof(*foo1));
    

请注意,隐藏typedef后面的指针被认为是不好的方式。它往往容易出错,并且会产生非惯用代码,使读者和程序员都感到困惑。