[英]dereferencing pointer to incomplete type ‘struct name’
我正在尝试编写一个双向链接的线性列表。 我想显示列表的大小,但它显示错误: dereferencing pointer to incomplete type 'struct List'
。
main.c :
#include "dlist.h"
#include <stdio.h>
int main(){
struct List* l;
Create(l);
printf("%d", *(l->size));
return 0;
}
dlist.c :
typedef int T;
struct Node{
struct Node* prev;
struct Node* next;
T data;
};
struct List {
struct Node* head;
int size;
};
void Create(struct List* l){
l->head = (struct Node*)malloc(sizeof(struct Node));
l->head->next = NULL;
l->head->prev = NULL;
l->size = 0;
}
dlist.h:
typedef int T;
struct Node;
struct List;
void Create(struct List* Item);
您似乎正在导入“dlist.h”,而所有声明都出现在实现文件AKA“dlist.c”中。
您应该将可见的声明放到“.h”文件中。 不仅是类型 - function 声明也是如此。
通过在 header 中声明结构类型但不包括其定义(即其成员列表),您创建了一个不透明类型。 因为dist.c之外的代码没有定义,所以它不能声明该类型的对象或访问它们的成员。 该类型对此类代码是不透明的。
但它可以创建和处理指向该类型对象的指针,这不需要有关该类型的大小或成员的信息。 这就是为什么编译器不会 object 直到它到达printf
调用,其第二个参数是一个表达式,它试图访问一个struct List
的成员,其定义在 Z31A1FD140BE4BEF2D11E121EC9A18A58 中不可见
从这里到 go 有两个可能的方向。 一种是将struct List
的定义移动到dist.h中,可能还有struct Node
的定义。 dist.c然后将#include
header 来获取这些,就像其他人一样,并且在main()
中,您将能够直接访问结构成员,就像您尝试做的那样。
另一种方法,当一个类型被故意设为不透明时使用,是提供适当的函数来操作你的类型的对象,例如:
int get_size(struct List *list) {
return list->size;
}
这将在 dist.c 中的go与您的Create()
function 一起声明,并在dist.h中声明,并将您的main()
说到您的Create()
function,它被错误地命名为损坏,并且您对它的使用不正确(综合起来,我最初将其称为损坏)。 您目前正在向它传递一个未初始化的指针,这是无用的,它是导致Create()
然后尝试通过该指针访问 object 时出现的未定义行为的关键因素。
初始化 function(例如您的Create()
是可以的,并且可以使用任何一种方法,但是对于不透明类型的方法,您确实需要真正的实例创建 function,因为您不能声明不透明类型的对象。 这样的 function 通常会返回指向创建的 object 的指针。 对于这样的 function 来说,执行初始化是很自然的,并且在许多情况下,这将讨论单独的仅初始化 function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.