Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;错误:取消引用指向不完整类型的指针;在c中_C_Struct - Fatal编程技术网

&引用;错误:取消引用指向不完整类型的指针;在c中

&引用;错误:取消引用指向不完整类型的指针;在c中,c,struct,C,Struct,好吧,这个问题我在谷歌上已经看了一百万遍了,但对我来说还是没有成功。 我正在尝试创建一个链接列表。下面是在List.c中定义的结构: typedef struct List { unsigned int size; ObjectP head; } List; 现在您会注意到,struct和typedef都是命名列表,据我所知,这很好。但重要的是结构不是匿名的 现在在List.h(当然包括在List.c)中,我定义了另一个typedef: typedef struct List*

好吧,这个问题我在谷歌上已经看了一百万遍了,但对我来说还是没有成功。 我正在尝试创建一个链接列表。下面是在
List.c
中定义的结构:

typedef struct List
{
    unsigned int size;
    ObjectP head;
} List;
现在您会注意到,struct和typedef都是命名列表,据我所知,这很好。但重要的是结构不是匿名的

现在在
List.h
(当然包括在
List.c
)中,我定义了另一个typedef:

typedef struct List* ListP;
据我所知,它将ListP定义为指向名为List的结构的指针,就像我真正命名它一样

这里是我得到错误的地方:

void freeList(ListP list)
{
    ObjectP obj1;
    ObjectP obj2;
    if (list != NULL)
    {
        obj1 = list->head;
        while (obj1->next != NULL)   <---- HERE
        {
            obj2 = obj1;
            obj1 = obj1->next;   <---- HERE
        freeObject(obj2);
        }
    free(list);
    }
}

还是不知道是什么问题

ObjectP
被定义为指向
Object
的指针,
Object
的成员类型为
ObjectP
。这是一个循环依赖项

尝试:

哦,还有任务演员:

obj1 = (ObjectP) obj1->next;

看起来您在不同的C文件(可能是Object.C)中定义了
ObjectP
的结构。当编译器编译List.c时,它不知道其他c文件中定义的任何内容,只知道当前c文件中包含的h文件中定义的内容


不同c文件共享的结构必须在头文件中定义,头文件可以包含在所有c文件中。因此,如果您只是将
struct Object
的定义移动到Object.h,您应该可以。

下一个
定义在哪里?是否在代码中包含
ObjectP
是什么?如何定义ObjectP?在使用它定义列表结构之前是否正确定义了它?什么是
ObjectP
?我假设您将它用作列表中的节点,但您没有提供任何定义。出现错误是因为您如何使用
ObjectP
,而不是因为与
ListP
类型相关的任何内容。您的问题以“和在Object.c中我有[code>对象的定义
]”的部分开始和结束。如果它在
对象.c
文件中,则
列表.c
中的代码不知道构成
对象的任何字段。因此,当您尝试访问一个时会出现错误。你需要在
Object.h
中定义你的
对象
结构(或者从
List.c
中删除对该结构内部事物的引用)。我很确定你的typedef中的顺序是颠倒的。你是什么意思?它在这里编译。强制转换无法解决“不完整类型”问题@bmearns遇到了真正的问题。
typedef struct object_st {
    void* key;
    struct object_st *next;
} Object;

typedef ObjectP *Object;
obj1 = (ObjectP) obj1->next;