为什么这个“解除指向不完整类型的指针”错误?

时间:2015-03-20 17:08:41

标签: c pointers struct

我知道这个问题已经过时了,但我似乎无法理解我的代码有什么问题。

我有一个tree.c文件,其中包含以下struct tree,此文件包含一个头文件,其中声明了指向此类结构的指针:

tree.c

#include "tree.h"

typedef struct tree
{
    char desig[200];
    int num;
    tree_ptr left, right, subtree;
} Tree;

tree.h中

#ifndef ___TREE_H___
#define ___TREE_H___

typedef struct tree *tree_ptr;

#endif

当我尝试在另一个源文件中访问此结构的某个实例时,编译器会向我提供指向不完整类型的"解除引用指针"错误:

insert(..., instance->subtree);

出了什么问题?

3 个答案:

答案 0 :(得分:1)

尝试制作以下tree.h文件:

   #ifndef  tree_h_
   #define  tree_h_

   typedef struct tree
   {
       char desig[200];
       int num;
       struct tree *left, *right, *subtree;
    } Tree;

   typedef struct tree *tree_ptr;

   #endif

并从您的实现文件中删除Tree的声明。由于没有显示小型的工作MCVE或SSCCE,我无法在您的具体情况下测试上述解决方案,但是以下简单程序在没有警告的情况下编译(gcc -ansi -pedantic -Wall tr​​ee.c -o tree_test)或错误:

file tree.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "tree.h"


    int main(int argc, char* argv[])
    {
         Tree  root;

         root.left = malloc(sizeof(Tree));
         root.right = malloc(sizeof(Tree));
         root.subtree = NULL;

         if((NULL != root.left) && (NULL != root.right))
         {
             root.left->left = NULL;
             root.left->left = NULL;

             root.right->left = NULL;
             root.right->right = NULL;
         }

         return 0;
    }

这是在Centos 7系统上使用gcc版本4.8.2进行测试的。

N.B。我只提供了极简主义错误检查,没有错误处理,也没有清理代码来保持示例简短。当然,在您的代码中,您应该确保完整的错误检查,错误处理和清理。

答案 1 :(得分:0)

您的头文件只有指针类型的定义&#34; tree_ptr&#34;。指针在32位机器上总是4个字节,无论它们指向的是什么。因此,只要您没有访问&#34; struct tree&#34;的成员你没关系,即为#34; tree_ptr&#34;类型的指针指定值时或者在检查类型&#34; tree_ptr&#34;的指针时不是NULL。这些操作不需要完整的结构定义。但是,如果要访问此结构的成员,则代码需要范围中的结构定义。结构不像函数,所以你不能在标题中声明它们并在.c文件中定义它们。所以我建议你将结构定义移动到头文件中。

答案 2 :(得分:0)

其他源文件无法看到您的tree.c,并且完全不知道您tree.c中的内容。他们只能看到tree.h声明

typedef struct tree *tree_ptr;

并将struct tree声明为不完整类型。

您的struct treetree.c内的完整类型,仅在tree.c内。在所有其他.c文件中,它是一个不完整的类型。如果您希望在包含tree.h的所有源文件中完整,则必须将struct tree的完整声明移至tree.h