错误:取消引用指向不完整类型的指针

时间:2010-08-31 17:22:50

标签: c

我有以下代码部分:

typedef struct Object* ObjectP;

ObjectP CreateObject(void *key) {

    printf("GOT %d\n",(*(int*) key));
    ObjectP objP = (ObjectP) malloc(sizeof(Object));
    if (objP == NULL) {
        //TODO ReportError(MEM_OUT);
        return NULL;
    }
    objP->_key = key;
    objP->_next = NULL;
    objP->_numInChain = 1;

    return objP;

}

typedef struct Object {
  ObjectP _next;
  void* _key;
  int _numInChain;
} Object;

并在另一个档案中:

void IntPrint(const void *key) {
    assert(key != NULL);
    printf("%d",*((const int*)key));
}

在另一个文件中我有main():

int main(int argc, char* argv[]) {
 int* key = (int*) malloc(sizeof(int));
 *key = 20;
 ObjectP a = CreateObject(key);
 IntPrint(a->_key);  //THIS DOESN'T COMPILE
 return 0;
}

IntPrint无法编译。它写道:
错误:取消引用指向不完整类型的指针
我无法理解为什么,因为IntPrint收到void *而a-> _key也无效*。

谢谢!

3 个答案:

答案 0 :(得分:3)

你发布了一堆几乎不相关的代码,但省略了最重要的代码:什么是ObjectP以及它是如何定义的?编译器告诉您它被定义为指向不完整类型的指针。那是你的问题。如果没有实际看到它,那么定义究竟出了什么问题是不可能的。

修改后:您的问题是struct Object的定义在您尝试访问a->key时无法看到(in.e. in { {1}})。你要么忘了把它包括在内,要么就是这样。 main的定义是否与struct Object的定义位于同一个头文件中?

答案 1 :(得分:2)

你在哪里定义了ObjectP?我建议在完全定义Object之前不要声明它:

typedef struct Object {
  struct Object*  _next;
  void* _key;
  int _numInChain;
} Object;

typedef Object* ObjectP;

这样使用ObjectP应该总是安全的。但是,如果没有发布更多代码,这只是一个盲目的猜测。

答案 2 :(得分:0)

main功能中尝试以下操作:

IntPrint((const void *) a->_key);

结构_keyObject的定义没有修饰符constant,这可能会导致警告或错误,具体取决于您在编译时使用的标记。< / p>