为什么警告:从不兼容的指针类型分配?

时间:2013-05-30 13:28:02

标签: c arrays pointers error-handling

我知道其他人发布了同样的错误,但我找不到与我相似的任何内容。我尝试过实现一些解决方案,但无法弄清楚它为什么不起作用。

struct list_elem {
        int value;
    struct list *prev;
    struct list *next;
};

struct list{
    struct list_elem *header;
    struct list_elem *footer;
};

struct list_elem *list_elem_malloc(void) {
    struct list_elem *elem;
    elem = malloc( sizeof(struct list_elem) );

    return elem;
}

void list_init(struct list *list) {
    list->header = list_elem_malloc();
    list->footer = list_elem_malloc();

    list->header->prev = NULL;
    list->footer->next = NULL;
    list->header->next = list->footer;   //ERROR on this line
    list->footer->prev = list->header;   //same ERROR on this line
}

为什么会出错?

我在struct list_elem中输入了一个拼写错误,prev和next应该是list_elems,而不是列表!!!!傻我。

3 个答案:

答案 0 :(得分:3)

您根据声明将list->footer的内容list_elem*分配给list->header->nextlist*类型prev。这只是工作中的类型安全,类型不兼容。

您可能打算将next的成员list_elemlist_elem*声明为list*类型,而不是{{1}}。

答案 1 :(得分:2)

你在struct liststruct list_elem之间混淆了。

看起来你只需要改变:

struct list_elem {
    int value;
    struct list *prev;
    struct list *next;
};

为:

struct list_elem {
    int value;
    struct list_elem *prev;
    struct list_elem *next;
};

答案 2 :(得分:1)

list->footerstruct list_elem *list->header->nextstruct list *,因此这些作业无法发挥作用:

list->header->next = list->footer;   //ERROR on this line
list->footer->prev = list->header;   //same ERROR on this line

它们是不同的类型,因此它们确实不兼容。看起来您希望nextprevstruct list_elem *