【问题标题】:C error - dereferencing pointer to incomplete typeC 错误 - 取消引用指向不完整类型的指针
【发布时间】:2018-05-31 01:41:35
【问题描述】:

我正在尝试从我创建的 Tree 字段中获取信息,但标题中出现错误:取消引用指向不完整类型“struct List_t”的指针

树源文件:

    struct Node_t{
Element data;
char* location;
struct Node_t*  son;
struct Node_t* next; 
};
    struct List_t{
Node head;
copyFunc copyfunc;
compareFunc compfunc;
freeFunc freefunc;
printFunc printfunc;
};

树头文件:

typedef struct Node_t* Node;
typedef struct List_t* Tree;
typedef void* Element;

应用源文件:

Tree t;
t = createTree(compareInt, copyInt , freeInt, printInt);
int* x =(int*)malloc(sizeof(int));
*x=53;
Add(t, x);
char* location;
location= t->head->location; //here I got the error
printf(location);

我该怎么办?我究竟做错了什么?

谢谢!

【问题讨论】:

  • 你应该选择tour,尤其是How to Ask
  • 感谢您将实际错误消息复制到问题中。现在,请将所有需要的代码复制到问题中。这里有能干且通常乐于助人的人,他们只是拒绝关注链接。因此,您可以通过使用屏幕截图快捷方式来减少获得好答案的机会。
  • 感谢您的评论@Yunnosch 我编辑了它。希望现在有意义。
  • 请阅读链接minimal reproducible example,仅仅通过阅读文字来猜测概念的复杂细节是不够的。您的问题现在包含很多相关代码,但距离成为 MCVE 还很远。例如,您是否以及在何处包含您描述为“树源文件”的文件仍然不可见。知道它是编译的源文件(tree.c)还是包含的头文件(tree.h)也会很有趣,“trees source file”意味着.c。

标签: c pointers dereference


【解决方案1】:

您提供了三段代码,并将它们标识为:

  1. 树源文件:

  2. 树头文件:

  3. 应用源文件:

我们将这些文件称为tree.ctree.happ.c

当您编译@​​987654324@ 源文件时,通常您有一个.c 文件,其中可能包含以下行:

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

在里面。这就是编译器知道如何在另一个文件中查找定义的方式。

如果您的app.c 文件包含上述行,那么app.c 内的代码可能只使用stdio.htree.h 提供的信息。

特别是,如果您在 tree.c 中提供了信息,则该信息对 app.c 不可见,因为没有引用它的 #include 指令。

解决方案是(正如其他人所说)将您的struct 定义和typedef 语句以及公共接口 的任何其他部分移动到tree.h 文件中。

或者,如果您希望结构的成员是私有的,您可以提供一个返回数据的函数。当然,该函数的声明将是 public interface 的一部分,因此它也必须在 tree.h 文件中(函数的 定义 可以位于tree.c,但声明将是公开的)。

【讨论】:

  • @MaorE 请注意这个答案所花费的额外努力,用于描述回答者必须做出的猜测和假设。你看到你的代码引用与实际 MCVE 的区别了吗?
【解决方案2】:

struct List_t 的声明需要在头文件中。连同createTree 的声明。

【讨论】:

  • 谢谢。它已经被取消了。也许是别的东西?
  • @MaorE 如果您认为 William 提到的类型已经在您的错误点声明,那么请确定执行此操作的行。请注意,树源文件中的行不是答案。或者不应该 - 你不包括源文件是吗?使用minimal reproducible example 会容易得多。
  • 编译器看不到结构的声明。这就是错误的意思。您需要使其可见,最简单的方法是将其添加到标题中。如果这是一个练习,也许目的是演示不透明类型,这意味着您不应该在结构内部达到峰值,而是使用一些提供的 API。
  • @Yunnosch 我的头文件中的第二行是一个声明。我错了吗?
  • @MaorE 这是一个声明,是的。但是是指向结构的指针类型,而不是结构。
猜你喜欢
  • 2017-11-02
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2018-04-09
相关资源
最近更新 更多