2011-05-02 87 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