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