我知道其他人发布了同样的错误,但我找不到与我相似的任何内容。我尝试过实现一些解决方案,但无法弄清楚它为什么不起作用。
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,而不是列表!!!!傻我。
答案 0 :(得分:3)
您根据声明将list->footer
的内容list_elem*
分配给list->header->next
,list*
类型prev
。这只是工作中的类型安全,类型不兼容。
您可能打算将next
的成员list_elem
和list_elem*
声明为list*
类型,而不是{{1}}。
答案 1 :(得分:2)
你在struct list
和struct 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->footer
是struct list_elem *
而list->header->next
是struct list *
,因此这些作业无法发挥作用:
list->header->next = list->footer; //ERROR on this line
list->footer->prev = list->header; //same ERROR on this line
它们是不同的类型,因此它们确实不兼容。看起来您希望next
和prev
为struct list_elem *
。