簡體   English   中英

我的struct typedef有什么問題導致“將指針解引用為不完整的類型?”

[英]What is wrong with my struct typedef causing “dereferencing pointer to incomplete type?”

我在使用MakeFile編譯文件時分別遇到5個問題(api.c api.h datastruct.c datastruct.h和main.c)時遇到了我的大學項目的問題,問題出在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.hi中具有結構定義:

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

仔細閱讀您寫的內容:

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

沒有諸如struct vertex_t這樣的東西(關於edge的推理是相似的)。 將您的typedef更改為:

typedef vertex_t *vertex;
typedef edge_t *edge;

要么:

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

與您的問題無關,正如用戶Zan Lynx在評論中所說,用calloc分配會將結構的所有成員都清零,因此用NULL初始化它們是多余的。

您的問題在這里:

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

它應該是:

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

我找到了。

您的問題出在您的typedef中。 在C中,typedef創建一個新的類型名稱。 但是,結構名稱不是類型名稱。

因此,如果將typedef struct vertex_t *vertex更改為typedef vertex_t *vertex ,它將修復該錯誤消息。

暫無
暫無

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

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