2017-01-21 70 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後面的指針。它傾向於容易出錯,併爲讀者和程序員產生非慣用代碼混淆。

相關問題