我编写了以下代码但是当我尝试编译代码时,编译器显示以下错误。我的错在哪里?
编译器错误:
main.c:32:39:错误:解除引用指向不完整类型'struct Information'的指针 printf(“信息:%d \ n”,ptr-> _number);
#include <stdio.h>
#include <stdlib.h>
typedef struct Informaion{
int _number;
struct Informaion *next;
} Information;
int main(int argc, char const *argv[]){
Information *temp;
Information *head;
temp = malloc(sizeof(Information));
temp->_number = 20;
head = temp;
temp = malloc(sizeof(Information));
temp->_number = 21;
head->next = temp;
temp = malloc(sizeof(Information));
temp->_number = 22;
head->next->next = temp;
temp = malloc(sizeof(Information));
temp->_number = 23;
head->next->next->next = NULL;
struct Information *ptr = head;
while(ptr != NULL) {
printf("Information : %d\n", ptr->_number);
ptr = ptr->next;
}
free(head);
free(temp);
return 0;
}
答案 0 :(得分:3)
您的类型名称为struct Informaion
。在您正在使用的行中
struct Information *ptr = head;
要解决此问题,您可以修复拼写错误,也可以直接使用typedef。
Information *ptr = head;
作为一般做法,您不应使用以下划线开头的变量或任何标识符。这些是为编译器保留的。建议您将_number
更改为其他内容。
答案 1 :(得分:2)
结构定义中存在拼写错误
typedef struct Informaion{
^^^
int _number;
struct Informaion *next;
} Information;
因此,请在声明中使用下面的任何地方使用类型说明符struct Informaion
或Information
。
此代码段
temp = malloc(sizeof(Information));
temp->_number = 23;
head->next->next->next = NULL;
没有意义。存储在指针temp中的地址的已分配对象不会添加到列表中。
编写
是正确的temp = malloc(sizeof(Information));
temp->_number = 23;
head->next->next->next = temp;
head->next->next->next->next = NULL;
要释放已分配的节点,您应该编写
for ( Information *ptr = head; head != NULL; ptr = head) {
head = head->next;
free( ptr );
}
答案 2 :(得分:0)
更改行:
struct Information *ptr = head;
到:
struct Informaion *ptr = head; //no t
或:
Information *ptr = head;
并且错误将消失。您可以使用struct Informaion
或Information
命名您可以定义的类型,因为您已typedef
编辑它。
注意 不建议使用以下划线开头的变量(例如_number
变量),因为编译器会使用这些名称。