我的struct typedef导致“解除指向不完整类型的指针?”有什么问题?

时间:2014-05-22 00:58:08

标签: c pointers gcc data-structures dereference

我在编译我的文件时遇到麻烦,当我编译我们的文件时,他们是5(api.c api.h datastruct.c datastruct.h和main.c),MakeFile问题出现在datastruct.c和datastruct中.h编译这个函数时:

vertex new_vertex() {
    /*This functions allocate memorie for the new struct vertex wich save 
    the value of the vertex X from the edge, caller should free this memorie*/

    vertex new_vertex = NULL;

    new_vertex = calloc(1, sizeof(vertex_t));
    new_vertex->back = NULL;
    new_vertex->forw = NULL;
    new_vertex->nextvert = NULL;

    return(new_vertex);   
}

在文件datastruct.h中我有结构定义:

typedef struct vertex_t *vertex;
typedef struct edge_t *alduin;

typedef struct _edge_t{
    vertex vecino;      //Puntero al vertice que forma el lado
    u64 capacidad;      //Capacidad del lado
    u64 flujo;          //Flujo del lado       
    alduin nextald;          //Puntero al siguiente lado
}edge_t;

typedef struct _vertex_t{
    u64 verx;   //first vertex of the edge
    alduin back; //Edges stored backwawrd
    alduin forw; //Edges stored forward
    vertex nextvert;

}vertex_t;

我看不出问题datastruct.h包含在datastruct.c中! 编译器的错误是:

gcc -Wall -Werror -Wextra -std=c99   -c -o datastruct.o datastruct.c
datastruct.c: In function ‘new_vertex’:
datastruct.c:10:15: error: dereferencing pointer to incomplete type
datastruct.c:11:15: error: dereferencing pointer to incomplete type
datastruct.c:12:15: error: dereferencing pointer to incomplete type

3 个答案:

答案 0 :(得分:3)

仔细阅读你写的内容:

vertex new_vertex = NULL; // Declare an element of type 'vertex'

但是vertex是什么?

typedef struct vertex_t *vertex; // A pointer to a 'struct vertex_t'

那么什么是struct vertex_t?嗯,它不存在。您定义了以下内容:

typedef struct _vertex_t {
    ...
} vertex_t;

这有两个定义:

  1. struct _vertex_t
  2. vertex_t
  3. 没有struct vertex_tedge的推理类似)。将typedef更改为:

    typedef vertex_t *vertex;
    typedef edge_t *edge;
    

    或者:

    typedef struct _vertex_t *vertex;
    typedef struct _edge_t *edge;
    

    与您的问题无关,正如用户Zan Lynx在评论中所述,使用calloc进行分配会使您的结构中的所有成员归零,因此使用NULL初始化它们是超级的。

答案 1 :(得分:2)

你的问题在这里:

typedef struct vertex_t *vertex;
typedef struct edge_t *alduin;

它应该是:

typedef struct _vertex_t *vertex;
typedef struct _edge_t *alduin;

答案 2 :(得分:2)

我找到了。

您的问题出在您的typedef中。在C typedef中创建一个新的类型名称。但是,结构名称不是类型名称。

因此,如果您将typedef struct vertex_t *vertex更改为typedef vertex_t *vertex,则会修复该错误消息。