我有以下代码部分:
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也无效*。
谢谢!
答案 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);
结构_key
中Object
的定义没有修饰符constant
,这可能会导致警告或错误,具体取决于您在编译时使用的标记。< / p>