我正在为我的基础c编程考试做这个练习,我得到了这个错误:“解除指向不完整类型的指针”,使用code :: blocks。 这是我的代码:
struct listPlot{
char name[25];
char surname[25];
int age;
struct listplot *next;
struct listPlot *prev;
};
struct listPlot *list;
struct listPlot *init(void)
{
list=malloc(sizeof(list));
list->next=NULL;
list->prev=NULL;
return list;
};
struct listPlot *addElement(struct listPlot *input)
{
printf("\nNew element, Name:\n");
gets(input->name);
printf("\nSurname:\n");
gets(input->surname);
printf("\nAge:\n");
scanf("%d", &input->age);
struct listPlot *newElement=malloc(sizeof(list));
*input->next=*newElement; //This is the line where the error occurs
newElement->next=NULL;
*newElement->prev=*input;
};
此函数addElement
应将listPlot指针作为输入,插入名称姓氏和年龄,创建列表的新元素并返回其指针。我不明白它有什么问题...我为我的愚蠢而道歉。
另一个问题,如果我写input->next=newElement;
而不是*input->next=*newElement;
我得到的错误只是警告:“从不兼容的指针类型[默认启用]”进行分配。对于我的无能,我再次感到抱歉,但我必须问你这是什么意思,两条线之间有什么区别。
希望你不介意帮助我,并提前感谢你。
答案 0 :(得分:1)
struct listPlot{ char name[25]; char surname[25]; int age; struct listplot *next; struct listPlot *prev; };
你上面有一个错字。 struct listplot *next
应为struct listPlot *next
(带有大写字母P)。你的编译器不知道struct listplot
是什么,当然,它不能取消引用它的指针。
list=malloc(sizeof(list));
这是错误的。大小应该是list
指向的大小,而不是list
本身。您还应该在使用之前测试malloc()
的返回值:
struct listPlot *init(void)
{
list = malloc (sizeof *list);
if (list) {
list->next=NULL;
list->prev=NULL;
}
return list;
}
struct listPlot *addElement(struct listPlot *input) { printf("\nNew element, Name:\n"); gets(input->name);
gets()
本质上是不安全的,应该(几乎)永远不会被使用。如果输入比您预期的要长,它将继续写入缓冲区之外。更好的选择是fgets()
。
.... struct listPlot *newElement=malloc(sizeof(list));
再次错误的尺寸。更好:
struct listPlot *newElement = malloc(sizeof *newElement);
取sizeof
左侧标识符,前面带一个星号,然后自动获得正确的大小(对于一个元素)。并且读者不需要查找list
是什么。
*input->next=*newElement; //This is the line where the error occurs newElement->next=NULL; *newElement->prev=*input;
这些行应该是:
input->next = newElement;
newElement->next = NULL;
newElement->prev = input;
}
此外,在某些函数定义的末尾有分号。那些错别字吗?我不认为他们会编译。