[英]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.