我编写了以下代码,但是当我尝试编译代码时,编译器显示以下错误。我的错在哪里?
编译器错误:
main.c:32:39:错误:取消引用指向不完整类型"结构信息"的指针 printf("Information : %d", 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 : %dn", ptr->_number);
ptr = ptr->next;
}
free(head);
free(temp);
return 0;
}
您的类型名称为 struct Informaion
。在您正在使用的行中
struct Information *ptr = head;
要解决此问题,您可以修复拼写错误,也可以直接通过typedef使用它。
Information *ptr = head;
作为一般做法,您不应使用变量或任何以下划线开头的标识符。这些是为编译器保留的。建议你把_number
换成别的东西。
结构定义中有拼写错误
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 );
}
更改行:
struct Information *ptr = head;
自:
struct Informaion *ptr = head; //no t
或:
Information *ptr = head;
并且错误将消失。你可以定义的类型可以使用struct Informaion
或Information
命名,正如你已经typedef
的那样。
请注意,不鼓励使用以下划线开头的变量(例如_number
变量(,因为这些名称由编译器使用。