簡體   English   中英

錯誤:取消引用不完整類型的指針

[英]error: dereferencing pointer to incomplete type

我有以下代碼部分:

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 *。

謝謝!

您發布了一堆幾乎不相關的代碼,但省略了最重要的代碼:什么是ObjectP以及如何定義它? 編譯器告訴您它被定義為指向不完整類型的指針。 那是你的問題。 如果不實際看到該定義,到底有什么問題是不可能說的。

編輯后:您的問題是,在嘗試訪問a->key (例如main ), struct Object的定義不可見。 您或者忘記了包含它或類似的東西。 struct Object定義是否與ObjectP定義位於相同的頭文件中?

您在哪里定義了ObjectP? 我建議在完全定義Object之前不要聲明它:

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

typedef Object* ObjectP;

這樣,使用ObjectP應該總是安全的。 但是,如果不發布更多代碼,這只是一個盲目的猜測。

在您的main功能中嘗試以下操作:

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

結構Object_key的定義沒有修飾符constant ,這可能會導致警告或錯誤,具體取決於您在編譯時使用的標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM