Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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 - Fatal编程技术网

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

C 错误:取消引用指向不完整类型的指针,c,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;

我有以下代码部分:

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;
}

在另一个文件中:

void IntPrint(const void *key) {
    assert(key != NULL);
    printf("%d",*((const int*)key));
}
在另一个文件中,我有一个主文件:

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*,而->\u键也是void*


谢谢

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


编辑后:您的问题是,在尝试访问->键的点上,struct对象的定义不可见。大体上。你要么忘了把它包括进去,要么就是诸如此类。结构对象的定义是否与ObjectP的定义位于同一头文件中?

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

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

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

请在主功能中尝试以下操作:

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

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

是否按照编译顺序发布代码段?我认为这不是问题所在。typedef ObjectP在头文件的GenericHashMap.h中定义,struct对象在GenericHashMap.c中定义。。我在开头加上了标题。@Asher:那是你的问题。您在.c文件中定义了struct对象,因此它对主函数不可见。因此,您会得到一个不完整的类型错误,这是您应该得到的。我假设main函数位于不同的.c文件中。
IntPrint((const void *) a->_key);