从不兼容的指针类型C返回

时间:2011-05-02 15:01:00

标签: c pointers hashtable

我仍然试图掌握C中的指针,结构和malloc。我正在尝试使用链表来实现哈希表。当我尝试编译时,我从不兼容的指针类型错误返回:

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;
        }
    }
}

我确信这里可能存在其他错误(可能是语义错误),但一次只有一件事:)

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

MList *ml_create(void){ 

应该是

struct MList *ml_create(void){ 

答案 1 :(得分:1)

在C中,struct声明不会自动引入新类型。您需要使用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%正确。