【问题标题】:Return from incompatible pointer type C从不兼容的指针类型 C 返回
【发布时间】:2011-05-02 15:01:00
【问题描述】:

我仍在尝试掌握 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;
        }
    }
}

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

感谢您的帮助

【问题讨论】:

  • 是的,“其他错误”之一是如果分配失败,您根本不会返回任何内容。

标签: c pointers hashtable


【解决方案1】:
MList *ml_create(void){ 

应该是

struct MList *ml_create(void){ 

【讨论】:

  • 你也可以避免每次都使用 typedef 明确告诉编译器它是一个结构体,声明你的结构体像:typedef struct MList { int size; struct Mlist_head hashtable[HASHSIZE]; } MList;
  • 我的头文件有一行:typedef struct mlist MList;在C文件中声明函数之前我还需要包含struct标签吗?
【解决方案2】:

在 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% 正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多