2014-02-10 67 views
1

我有以下結構,並試圖使用malloc來動態創建一個新的對象。它似乎現在工作與object_ptr obj_ptr1 = malloc(sizeof(object_ptr));這隻會將object_ptr的指針大小賦給obj_ptr1?但在這種情況下,你如何分配原始struct _object_t的大小?如何在指針上正確使用malloc?

typedef struct 
{ 
    int struct_id; 
    void *(*function)(void *); 
    int status; 
} _object_t; 

typedef struct _object_t* object_ptr; 

/* create a new object */ 
object_ptr obj_ptr1 = malloc(sizeof(object_ptr)); 
+1

通過將指針聲明爲指針並通過[*** not *** cast the 'malloc()']的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – 2014-02-10 23:50:07

+1

編輯完成後:現在它是一個指針,但仍然分配了錯誤的大小。你正在分配一個指向'struct _object_t'的指針的大小。也許你應該使用更多的名字,比如'struct object_t'和'object_ptr'。 – Nabla

+0

@chux不,它不是。 – 2014-02-11 00:00:31

回答

0

問題出在你的malloc行。您必須分配sizeof(_object_t)而不是sizeof(object_t)

4

指針類型的typedef通常是一個壞主意,因爲它們可能很難判斷類型名稱是否指向指針類型。

建議:

typedef struct { /* ... */ } object_t; 
object_t *obj1 = malloc(sizeof *obj1); 

如果你想爲N個對象的數組分配空間:

object_t *obj1 = malloc(N * sizeof *obj1); 

請注意,我已經刪除了領先從類型名稱中使用下劃線。以下劃線開頭的標識符保留給實施;你不應該在自己的代碼中定義它們。

malloc(sizeof *foo)成語可能會稍微習慣一些,但這意味着您不必多次指定類型名稱,這樣可以避免錯誤。 (該*obj1實際上並沒有取消引用obj1,因爲sizeof操作數不被評估。)

在您的代碼:

object_t obj1 = malloc(sizeof(object_t)); 

因爲object_t爲指針類型,你分配足夠的內存來保存一個指針對象,而不是一個結構對象。 (分別使用類似名稱object_t_object_t作爲指針和結構類型,無疑是造成混淆的原因。)