我知道这个问题已经过时了,但我似乎无法理解我的代码有什么问题。
我有一个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);
出了什么问题?
答案 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 tree.c -o tree_test)或错误:
#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 tree
是tree.c
内的完整类型,仅在tree.c
内。在所有其他.c
文件中,它是一个不完整的类型。如果您希望在包含tree.h
的所有源文件中完整,则必须将struct tree
的完整声明移至tree.h
。