2011-05-02 25 views
1

我仍然試圖抓住C中的指針,結構和malloc。我試圖用鏈表來實現哈希表。我碰到不兼容的指針類型的錯誤一回,當我嘗試編譯:從不兼容指針類型C返回

struct Mlist_head{ 
    struct Mlist_node *head; 
    struct Mlist_node *tail; 
}; 

struct MList { 
    int size; 
    struct Mlist_head hashtable[HASHSIZE]; 
}; 

MList *ml_create(void){ 

    struct MList *m; 
    struct Mlist_head *h; 
    int i; 

    if ((m = (struct MList *)malloc(sizeof(struct MList))) != NULL){ 
     if ((h = (struct Mlist_head *)malloc(sizeof(struct Mlist_head))) != NULL) { 
      for (i = 0; i < HASHSIZE; i++) { 
       h = &(m->hashtable[i]); 
       h->head = NULL; 
       h->tail = NULL; 
      } 
      printf("worked"); 
      return m; 
     } 
    } 
} 

我敢肯定,有可能在同一時間:)

在這裏(可能語義),但有一點其他錯誤

感謝您的幫助

+0

是的,「其他錯誤」之一是,如果分配失敗,則根本不返回任何內容。 – 2011-05-02 17:17:00

回答

4
MList *ml_create(void){ 

應該

struct MList *ml_create(void){ 
+0

你也可以避免每次使用typedef明確地告訴編譯器它是一個結構體,聲明你的結構體如下:'typedef struct MList int size;struct Mlist_head hashtable [HASHSIZE]; } MList;' – 2011-05-02 15:05:26

+0

我的頭文件有這樣一行:typedef struct mlist MList;在C文件中聲明funtion之前,我還需要包含struct標記嗎? – bond425 2011-05-02 15:09:08

1

在C語言中,一個struct聲明不會自動引入新的類型。您需要使用struct關鍵詞與你給結構名稱(在技術上稱之爲結構的標籤):

struct MList *ml_create(void); 

您可以解決此通過定義一個新的類型名稱,使用typedef關鍵字:

typedef struct Mlist_head MList; 

現在你可以這樣做:

MList ml_create(void); 

另外:

對於這最後兩點,比較您的代碼:

if ((m = (struct MList *)malloc(sizeof(struct MList))) != NULL){ 

這一點,這是我會怎麼寫呢:

if ((m = malloc(sizeof *m)) != NULL) { 

對我來說,後者是非常容易得多因爲它的噪音較小,並且它也更安全,因爲它不重複類型名稱。如果m指針的類型後來改變,我的版本仍然是100%正確的。

+0

啊謝謝!我正在施放返回值? – bond425 2011-05-02 15:06:32