我在 Linux 中有奇怪的警告。在 Windows 上的 Visual Studio 中,代碼編譯并運行良好,但我需要使用 GCC c90 編譯它,我收到以下警告:
我已經像這樣初始化了矩陣:
typedef float mat[4][4];
現在我想創建一個矩陣陣列:
mat MAT_A = { 0 };
mat MAT_B = { 0 };
mat MAT_C = { 0 };
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
我已經宣告了函式:
void get_input(mat** matrices);
并使用它:
get_input(&matrices);
代碼運行良好,但我需要用 gcc c90 編譯它。我得到這個警告:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
mat *(*matrices)[3] = {MAT_A, MAT_B, MAT_C};
^~~~~
和
warning: passing argument 1 of ‘get_input’ from incompatible pointer type [-Wincompatible-pointer-types]
flag = get_input(&matrices);
^
uj5u.com熱心網友回復:
由于這個 typedef 宣告
typedef float mat[4][4];
陣列宣告為
mat MAT_A = { 0 };
在此宣告中隱式轉換為其第一個元素
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
的型別float( * )[4]。但是變數矩陣被宣告為具有元素型別float ( * )[4][4]。這些型別不兼容。
那實際上是您有以下宣告
float ( *matrices[3] )[4][4] = {MAT_A, MAT_B, MAT_C};
你應該像這樣宣告陣列
float ( *matrices[3] )[4] = {MAT_A, MAT_B, MAT_C};
在這種情況下,函式應該宣告為
void get_input( float ( ** matrices)[4] );
并稱為
get_input( matrices );
或喜歡
mat *matrices[3] = { &MAT_A, &MAT_B, &MAT_C };
在最后一種情況下,該函式被稱為
get_input( matrices );
宣告的函式也get_input像
void() get_input(mat** matrices);
實際上相當于
void() get_input( float ( ** matrices )[4][4]);
但是在這個函式的呼叫中
get_input(&matrices);
引數具有型別
float( * ( * ) [3])[4][4]
uj5u.com熱心網友回復:
是一個由 3 個指標組成的mat *matrices[3]陣列mat。所以需要用指向 mat 的指標來初始化它。
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};
此外,當呼叫 時get_input(&matrices);,&matrices是一個指向 3 個指標陣列的指標mat。這不是get_input()期望的指標指向的指標mat。只需使用:
get_input(matrices);
運算式matrices轉換為指向其第一個元素的指標,該元素是指向 的指標mat。結果,運算式的型別是指向 的指標的指標mat,這正是get_input預期的。
現在代碼編譯沒有警告。見https://godbolt.org/z/84qd4rrnx
uj5u.com熱心網友回復:
改變
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
到
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470447.html
上一篇:動態記憶體分配與使用指標
