如果我有一個多維數組這樣的:多維陣列參考
int arr2d[2][3] = {{0,1,2}, {10,11,12}};
我可以將它傳遞給這樣的功能:
void foobar(int arg[][3])
這不是由呼叫值,這是通過引用調用的,所以只是一個指向開始地址的指針,但編譯器仍然知道它是一個二維數組,並且我可以像訪問函數一樣訪問它。
現在如何在一個結構中工作?
typedef struct {
int arr2d[][3];
} Foobar_t
首先這給了我:error: flexible array member in otherwise empty struct
。我可以這樣解決這個問題:
typedef struct {
int dummy;
int arr2d[][3];
} Foobar_t
它將編譯沒有錯誤或警告。但是,當我嘗試使用它像Foobar_t foobar = {1337, arr2d}
我得到一些警告:
missing braces around initializer
initialization makes integer from pointer without a cast
和訪問時:subscripted value is neither array nor pointer nor vector
。
一維數組很容易被視爲指針。但對於多維數組,編譯器需要知道不同維度的大小才能正確計算偏移量。有沒有方法(int (*)[3])
和爲什麼語法不同於函數參數?
所以這是變通我想避免:
#include <stdio.h>
static int testArr[2][3] = {{0,1,2},{10,11,12}};
typedef struct {
int *arr2d;
} Foobar_t;
int main(int argc, char** argv) {
Foobar_t foobar = {(int*)testArr};
int (*arr2d)[3] = (int (*)[3]) foobar.arr2d;
printf("testStruct_0_0: %d\n", arr2d[0][0]);
printf("testStruct_1_0: %d\n", arr2d[1][0]);
return 1337;
}
編輯:
一些言論表明,引用不正確的單詞。當然在C語言中,這是通過一個指針來實現的。 因此,這個問題的TLDR是:指針類型到多維數組的語法是怎樣的。
答案已經可以在我的解決方法代碼中看到。所有這一切,一起前進,沒什麼可看的;)儘管如此,謝謝你的回覆。
有一個結構,只是爲FAM在用C –
沒有提到你不能有不完全類型至少有一個其他成員(因此是你的「虛擬」成員)的結構的結尾。當你有一個FAM時,你必須動態地分配正確數量的內存結構。 –
在你的解決方法中,你的代碼行'Foobar_t foobar = {(int *)testArr};'可以寫得更乾淨'Foobar_t foobar = {&testArr [0] [0]};' - 不需要強制轉換。第二個演員不容易避免。 –