我正在为我的基础c编程考试做这个练习,我得到这个错误:"解引用指针到不完整类型",使用代码::块。下面是我的代码:
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;
,我没有得到错误,但警告:"从不兼容的指针类型[默认启用]分配"。我再次为我的无能道歉,但我必须问你这是什么意思,这两行有什么不同。希望你不介意帮助我,提前谢谢你。
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;
}
另外,在一些函数定义的末尾有分号。这些是错别字吗?