2011-08-22 64 views
1

好的,我在Google上看过这个问题一百万次,但对我而言仍然没有成功。 我想创建一个链表。下面是List.c定义的结构:“error:取消引用指向不完整类型的指针”in c

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

现在,你会发现两者的结构和类型定义命名名单,这是罚款,据我所知。但重要的是该结构不是匿名的。

现在List.h(这当然包括在List.c)我定义了另一个类型定义:

typedef struct List* ListP; 

其中,据我了解它定义ListP是一个指向一个struct名为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->head;是好的,但在其他地方我尝试访问结构成员我有这样的错误。 正如我所说我已经试过寻找它,但其他脂肪酶有错误,我无法在我的代码中找到。谢谢!

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

in Object.h我有typedef struct Object* ObjectP; 和Object.c我有

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

还是不知道是什么问题!

+0

下一个是哪里定义的? – duedl0r

+0

小心在代码中包含什么'ObjectP'? –

+0

你如何定义ObjectP?在使用它定义List结构之前,它是否正确定义? –

回答

0

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

尝试:

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

typedef ObjectP *Object; 

哦,塑像为分配:

obj1 = (ObjectP) obj1->next; 
+0

我很确定您的typedef中的订单是切换的。 –

+0

你是什么意思?它在这里编译。 – deStrangis

+0

演员无法解决“不完整类型”问题。 @bmearns遇到了真正的问题。 – ugoren

2

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

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

相关问题