【问题标题】:"error: dereferencing pointer to incomplete type" in cc中的“错误:取消引用指向不完整类型的指针”
【发布时间】:2011-08-22 11:03:23
【问题描述】:

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

typedef struct List
{
    unsigned int size;
    ObjectP head;
} List;

现在您会注意到 struct 和 typedef 都被命名为 LIST,据我所知,这很好。但重要的是该结构不是匿名的。

现在在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);
    }
}

我不明白为什么obj1 = list-&gt;head; 没问题,但在其他任何地方我尝试访问结构成员时都会遇到此错误。 正如我所说,我已经尝试寻找它,但是其他人有我在我的代码中找不到的错误。谢谢!

编辑:List.c 还包括 Object.h 所以这不是问题。对象定义如下:

Object.h 我有typedef struct Object* ObjectP; 在Object.c 我有

typedef struct Object
{
    void* key;
    ObjectP next;
} Object;

还是不知道是什么问题!

【问题讨论】:

  • next 定义在哪里?
  • 注意在代码中包含ObjectP 是什么?
  • 如何定义ObjectP?在使用它定义 List 结构之前,它是否正确定义?
  • ObjectP 是什么?我假设您将它用作列表中的节点,但您没有提供任何定义。您收到错误是因为您使用 ObjectP 的方式,而不是因为与您的 ListP 类型相关的任何内容。
  • 您的问题以“在 Object.c 中我有 [Object] 的定义”的部分开始和结束。如果它在您的Object.c 文件中,那么您在List.c 中的代码不知道构成Object 的任何字段。因此,当您尝试访问一个错误。您需要在 Object.h 内定义您的 Object 结构(或从 List.c 中删除对该结构内事物的引用)。

标签: c struct


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    试试:

    typedef struct object_st {
        void* key;
        struct object_st *next;
    } Object;
    
    typedef ObjectP *Object;
    

    哦,还有分配任务:

    obj1 = (ObjectP) obj1->next;
    

    【讨论】:

    • 我很确定你的 typedef 中的顺序已经转换了。
    • 什么意思?它在这里编译。
    • 强制转换不能解决“类型不完整”的问题。 @bmearns 遇到了真正的问题。
    猜你喜欢
    • 2018-05-31
    • 2017-11-02
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多