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