Error Traverse List of LinkedList in C
我编写了以下代码,但是当我尝试编译代码时,编译器显示以下错误。我的错在哪里?
编译器错误:
main.c:32:39: error: dereferencing pointer to incomplete type a€?struct Informationa€?
printf(“Information : %d\
“, ptr->_number);
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <stdio.h>
#include <stdlib.h> typedef struct Informaion{ int main(int argc, char const *argv[]){ Information *temp; temp = malloc(sizeof(Information)); temp = malloc(sizeof(Information)); temp = malloc(sizeof(Information)); temp = malloc(sizeof(Information)); struct Information *ptr = head; |
- 您的结构中有许多印刷错误。我不知道您要做什么,因为您没有说出来,但是如果您想打印地址,请使用 %p 而不是 %d
- 我想显示我为结构设置的数据。我修复它。
- @MikhailRazborov 如果您的问题得到解决,您可以接受一个答案。
- 调用任何堆分配函数时:(malloc、calloc、realloc),始终检查(!=NULL)返回值以确保操作成功
- 如果不使用 main() 的参数,则使用备用签名:int main( void )
- 这个词有很多变化:信息(或者是信息)是拼写的,所以代码无法编译。注意:前导下划线为编译器”保留”。建议将 _number 重命名为 number
- 对于对 malloc() 的每次调用,都必须使用从 malloc() 返回的相同指针调用 free()。实际上,代码有很多内存泄漏建议将 free(head); free(temp); 替换为: while( head) { ptr = head->next; free( head ); head = ptr; }
- 行:head->next->next->next = NULL; 不正确最后一次调用 malloc() 的结果应存储不为 NULL。然后将最终的 next 字段设置为:head->next->next->next->next = NULL;。顺便说一句:将 ->next 字段串在一起不是一个好主意,当有很多 struct Informaion 的链接实例时,它不会扩展。建议使用 for() 循环,跟踪先前链接的条目并使用它链接下一个条目。此外,通常最好在链接之前初始化新条目的所有字段
你的类型的名字是struct Informaion。在您使用
的行中
1
|
struct Information *ptr = head;
|
为了解决这个问题,你可以修正错字,或者你可以直接通过 typedef 使用它。
1
|
Information *ptr = head;
|
作为一般惯例,您不应使用以下划线开头的变量或任何标识符。这些是为编译器保留的。建议你把 _number 改成别的。
结构定义有错别字
1
2 3 4 5 |
typedef struct Informaion{
^^^ int _number; struct Informaion *next; } Information; |
所以要么在声明中的任何地方使用类型说明符struct Informaion 或Information。
此代码片段
1
2 3 |
没有意义。其地址存储在指针 temp 中的已分配对象未添加到列表中。
应该写成
1
2 3 4 |
temp = malloc(sizeof(Information));
temp->_number = 23; head->next->next->next = temp; head->next->next->next->next = NULL; |
要释放分配的节点,你应该写
1
2 3 4 |
换行:
1
|
struct Information *ptr = head;
|
到:
1
|
struct Informaion *ptr = head; //no t
|
或 :
1
|
Information *ptr = head;
|
并且错误将消失。您可以定义的类型可以使用 struct Informaion 或 Information 命名,因为您已经对其进行了 typedef 编辑。
请注意,不鼓励使用以下划线开头的变量(例如您的 _number 变量),因为编译器会使用这些名称。
来源:https://www.codenong.com/43979062/