簡體   English   中英

錯誤:在C中,在結構指針中得到錯誤“取消引用指向不完整類型的指針”

[英]Error: In C, got the error “dereferencing pointer to incomplete type” in a struct pointer

大家好!

我在嘗試測試游戲Clever Frog的代碼時遇到以下錯誤: 錯誤:取消引用指向不完整類型的指針

'完整代碼'位於pastebin.com - 此處 (不會過期)。 但我認為,通過下面的解釋,任何人都可以理解。 注意:我還沒有實現將擦除分配的內存和其他東西的功能。

我在1.c文件中定義了一個結構:

#include "1.h"
...
struct test {
   int a;
   };
...

我有一個1.h wicth有typedef使用它:

...
typedef struct test testT;
...

然后我有一個函數,其中有一個參數取決於testT,它在2.c:

...
void funcTest(testT **t, int *size, ..){
   /* another function that creates mem.space/alocate memory based enter code here`on the need of size above */
   createMem(t,*size); /* void createMem(testT **t, int size); */

   t[0]->a = 0; /*ERROR HERE*/
   /* ... more code ... */
}
...

2.h文件是這樣的:

...
void funcTest(testT **t, int *size, ..);
...

我將在主程序中以下面的方式傳遞testT * var

...
testT *varTest; int size;

funcTest(&varTest, &size);
...

奇怪的是,我在1.h文件中使用struct test時編譯代碼(從1.c中刪除struct test - 這是錯誤的)。 但是,當運行編譯的程序時,錯誤發生的確切位置是t [0] - > a的位置

我已經嘗試了“一切”但沒有任何效果:(我相信這是非常愚蠢的事情,所以如果有人知道的話,請告訴我:D謝謝!

當您試圖訪問a的成員t[0]結構的編譯器需要知道這個結構的樣子(例如,看看是否有甚至是任何a在其成員)。 由於您沒有將struct test類型定義放在編譯器在編譯2.c時可以看到的任何位置,因此會出現錯誤。 編譯器不知道struct test包含什么。

如果將struct test的定義放在1.h ,編譯器將看到該類型的外觀,並可以使用struct成員。

只需將完整的類型定義放在1.h ,即它應該是的位置。

某處你有一個預處理的文件

typedef struct test testT;

其中不包括

struct test {
   int a;
};

預處理內聯所有#includes指令。 只要你只使用一個testT指針,編譯器就會知道“分配一個指針的內存值”,編譯的進度會超出預期。

當你真正嘗試使用該指針取消引用某些東西時,編譯器會意識到它需要“struct test”的完整定義,你會得到錯誤。

如果希望結構在1.c和2.c中都可用,則必須在對兩者都可見的頭文件中定義它。 我不知道你為什么說這是“錯誤的”,這是常見的做法和AFAIK沒有別的辦法直接解決。

如果它僅在1.c中定義,則編譯器在處理2.c時不知道struct test是否具有名為“a”的成員。

另一種選擇是像現在一樣保持前向聲明,但也在頭部包含accessor / mutator函數。 然后2.c不必知道struct test的“內部”,但可以對它進行操作。 這在C API中也很常見。

(您也可以在1.c和2.c中相同地定義結構,但這是一個非常糟糕的主意。)

struct Test的定義僅在文件1.c中可見。 代碼t[0]->a沒有看到這個結構有一個名為a的成員。 在幾個編譯單元之間共享的類型可以在頭文件中定義!

您應該知道C / C ++分別編譯每個.c文件,因此無法知道該結構是否在其他.c文件中定義。

您應該執行以下操作:

(1.H)

struct test {
    int a;
};
...

(1.C)

#include "1.h"
...

(2.C)

#include "1.h"
...
void funcTest(testT **t, int *size, ..){
    createMem(t,*size); /* void createMem(testT **t, int size); */
    t[0]->a = 0;
    /* ... more code ... */
}

但是,當運行編譯的程序時,錯誤發生的確切位置是t [0] - > a的位置。

指向已分配內存的指針實際上是*t ,而不是t (從createMatrix代碼中可以看出),所以你應該這樣做:

(*t)[0].a

和你的for循環類似:

(*matriz)[i].row

暫無
暫無

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

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