我仍然试图掌握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;
}
}
}
我确信这里可能存在其他错误(可能是语义错误),但一次只有一件事:)
感谢您的帮助
答案 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);
此外:
malloc()
。sizeof *h
而不是sizeof (struct Mlist_head)
;它更短,更不容易出错。对于最后两点,请比较您的代码:
if ((m = (struct MList *)malloc(sizeof(struct MList))) != NULL){
有了这个,我就是这样写的:
if ((m = malloc(sizeof *m)) != NULL) {
对我而言,后者更容易阅读,因为它噪音较小,而且它也更安全,因为它不重复类型名称。如果m
指针的类型稍后改变,我的版本仍然是100%正确。