簡體   English   中英

使用指針分配給結構的內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM