意外错误:“使用code :: blocks,c语言取消引用指向不完整类型的指针”

时间:2014-06-27 15:40:20

标签: c list pointers linked-list codeblocks

我正在为我的基础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;我得到的错误只是警告:“从不兼容的指针类型[默认启用]”进行分配。对于我的无能,我再次感到抱歉,但我必须问你这是什么意思,两条线之间有什么区别。 希望你不介意帮助我,并提前感谢你。

1 个答案:

答案 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;
}

此外,在某些函数定义的末尾有分号。那些错别字吗?我不认为他们会编译。