簡體   English   中英

C錯誤:取消指向不完整類型的指針

[英]C Error: dereferencing pointer to incomplete type

因此,在運行此代碼時,我收到了“第51行:錯誤:將指針解引用為不完整類型”:

int main(void)
{
  Tree * testTree;

  testADT * data1;

  testTree = createTree(compare,destroy);

  data1 = malloc(sizeof(testADT));

  data1->val = 10;

  /* Line 51 */ addToTree(testTree,testTree->root,data1);

  destroyBinTree(testTree);

  return(0);
}

我的addToTreeFunction:

TreeNode * addToTree(Tree * theTree,TreeNode * theTreeNode, TreeDataTypePtr data)
{
TreeNode * newNode;
if(isEmpty(theTree))
{
    newNode = malloc(sizeof(TreeNode));
    newNode->height = 0;
    newNode->data = data;

    theTree->root = newNode;
    return theTree->root;
}else{
    if(theTree->compare(theTreeNode->data,data) == 1) /* shows root data is smaller */
    {
        theTreeNode->right = addToTree(theTree,theTreeNode->right,data);
    }else 
    if(theTree->compare(theTreeNode->data,data) == 0) /* shows root data is larger */
    {
        theTreeNode->left = addToTree(theTree,theTreeNode->left,data);
    }
}
return theTreeNode;
}

我的typedef和結構:

struct tADT{
int val;
};

typedef struct tADT testADT;

typedef void * TreeDataTypePtr;

任何人都可以對發生的事情提供一些見解嗎? 提前致謝!

編輯:這是在我的模塊(.c)

struct AvlNode{
void * data;
struct AvlNode * left;
struct AvlNode * right;
int height;
};


struct AvlTree{
int (*compare) (TreeDataTypePtr data1, TreeDataTypePtr data2);
void (*destroy) (TreeDataTypePtr data);
struct AvlNode * root;
};

這是在標題(.h)中

struct AvlTreeNode;
struct AvlTree;

typedef struct AvlTree Tree;
typedef struct AvlNode TreeNode;
typedef void * TreeDataTypePtr;

通過在標頭中定義所有結構/類型定義來解決問題:

typedef struct AvlTree Tree;
typedef struct AvlNode TreeNode;
typedef void * TreeDataTypePtr;

struct AvlNode{
void * data;
struct AvlNode * left;
struct AvlNode * right;
int height;
};


struct AvlTree{
int (*compare) (TreeDataTypePtr data1, TreeDataTypePtr data2);
void (*destroy) (TreeDataTypePtr data);
struct AvlNode * root;
};

您要在其中一個頭文件中的某個位置定義“樹”嗎? 發生故障的模塊的第51行可以看到該標頭嗎?

您必須定義“樹” :)

=====================附錄===================

感謝您使用“樹”的“定義”更新您的帖子:

// .h file
struct AvlTreeNode;
struct AvlTree;
typedef struct AvlTree Tree;
...

但是事實仍然存在-它們都是“不完整的類型”。

您說您在“模塊(.c)”中定義了AvlTree和AvlTreeNode。

問: 哪個 .c翻譯單位?

問:在嘗試使用翻譯單元之前 ,它是否已在該翻譯單元中定義?

問:它是否在其他翻譯單位中使用?

問:為什么重復/冗余/混淆typedef別名?

問:為什么,為了天堂,您不只是在.h文件中定義它嗎?

testTree->root取消引用testTree ,它是Tree類型,未在任何地方定義。

該錯誤表明您具有Tree的前向聲明,但沒有其相應結構的完整定義。 這就是為什么您可以聲明一個指向Tree的指針,但是不允許您取消引用其成員的原因。

確保包含main的編譯單元在包含struct Tree定義的頭文件的頂部具有#include ,這將解決此問題。

暫無
暫無

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

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