[英]Memory allocation to a struct with a pointer
在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
類型的別名。 您的原始分配聲明將起作用。
你必須使用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。
您的代碼在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后面的指針被認為是不好的樣式。 它往往容易出錯,並且會產生非慣用代碼,使讀者和程序員都感到困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.