【问题标题】:error: dereferencing pointer to incomplete type错误:取消引用指向不完整类型的指针
【发布时间】:2011-04-06 09:47:37
【问题描述】:

我有以下代码部分:

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 也是 void*。

谢谢!

【问题讨论】:

  • 您是否按照编译顺序发布了代码片段?

标签: c


【解决方案1】:

在您的 main 函数中尝试以下操作:

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

_key 在结构 Object 中的定义没有修饰符 constant,这可能会导致警告或错误,具体取决于您在编译时使用的标志。

【讨论】:

    【解决方案2】:

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

    编辑后:您的问题是struct Object 的定义在您尝试访问a->key 时不可见(即在main 中)。您要么忘记包含它,要么类似的东西。 struct Object的定义和ObjectP的定义在同一个头文件吗?

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我不认为这是问题所在。 typedef ObjectP 在 GenericHashMap.h 中定义(在标题中),struct Object 在 GenericHashMap.c 中定义。我在开头包含标题。
      • @Asher:那是你的问题。您在 .c 文件中定义了 struct Object,因此您的 main 函数看不到它。因此,您应该得到一个不完整的类型错误。 (我假设 main 函数在不同的 .c 文件中)。
      猜你喜欢
      • 2018-05-31
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2021-11-25
      • 2012-05-17
      相关资源
      最近更新 更多