2010-09-10 80 views
0

gcc 4.4.4 c89解引用指向不完整類型的指針

不知道爲什麼我得到此錯誤。

在我的頭文件我有以下

handle.h

typedef struct Handle_t Handle 

我在執行文件

handle.c

struct Handle { 
    size_t id; 
    char *name; 
}; 

Handle* create_handle(size_t id) 
{ 
    Handle *hdev = NULL; 
    hdev = malloc(sizeof(*hdev)); /* Error */ 
    . 
    . 
} 

非常感謝您的任何建議,

+0

我不認爲這就是爲什麼你會得到錯誤,但是你想使用sizeof(Handle),而不是sizeof(* hdev)。取消引用hdev是取消引用空指針。 – 2010-09-10 17:20:22

+0

@Merlyn:'sizeof * hdev'是正確的(就像'sizeof(Handle)')一樣。 'sizeof'運算符不計算參數,因此NULL是不重要的。 – pmg 2010-09-10 17:25:00

+0

@Merlyn Morgan-Graham:恰恰相反。你想特別使用'sizeof * hdev',而不是'sizeof(Handle)'。結果在兩種情況下都是相同的,但'sizeof * hdev'是一種更好的編程習慣,因爲它使代碼更獨立於類型。當然,這裏沒有空指針問題,因爲'sizeof'不會評估這個參數。 – AnT 2010-09-10 17:39:36

回答

6

我用來獲取typedef錯誤往往直到我開始想它像兩個部分:高清類型首先,然後def inition的一個新名稱。

typedef <type> <name>; 
typedef struct Handle Handle_t; /* defines Handle_t as struct Handle */ 
typedef char *c_string;   /* defines c_string as char * */ 
+1

+1約typedefing記憶 – teukkam 2010-09-10 17:23:33

+0

只是一個令人困惑的事情。 typedef struct Handle Handle_t。 '結構句柄'部分是類型。 Handle_t是定義。所以這個結構實際上叫做Handle_t。這是正確的嗎?謝謝。 – ant2009 2010-09-10 17:37:38

2

你的結構的名稱需要匹配的typedef:

struct Handle_t { 
    /* ... */ 
}; 
1
typedef struct Handle_t Handle 

你定義的結構被稱爲Handle,不Handle_t,這是你typedeffing什麼。

1

typedef結構爲handle_t拉手

鍵入定義結構爲handle_t到手柄,但該結構STRUCT手柄,所以無論是改變結構Hadle到結構爲handle_t或DEF鍵入。

1

struct Handle_t不是由編譯器到達與錯誤的行的時間來定義。

您已經定義了一個struct Handle並將類型Handle設置爲不存在的類型struct Handle_t。在C中有許多不存在的類型可以使用,但不適用於sizeof參數。

相關問題