與(gcc) Multi-Dim Array or Double Pointer for Warning-free Compile有關,有沒有辦法從函數返回所謂的「衰減數組指針」?總結(假設2 dim陣列)返回int (*a)[5]
格式而不是int**
格式?腐爛的多維數組返回功能
據我所知,返回時int**
指針被髮送到另一個函數等待(int*)[]
參數,它不能正常工作。
與(gcc) Multi-Dim Array or Double Pointer for Warning-free Compile有關,有沒有辦法從函數返回所謂的「衰減數組指針」?總結(假設2 dim陣列)返回int (*a)[5]
格式而不是int**
格式?腐爛的多維數組返回功能
據我所知,返回時int**
指針被髮送到另一個函數等待(int*)[]
參數,它不能正常工作。
是的,但是語法不會好看
int(*f())[5] {
static int a[1][5] = { { 1, 2, 3, 4, 5 } };
return a;
}
基本上,它只是你的a
由f()
(函數)代替。使用一個typedef它變得更具可讀性
typedef int inner_array[5];
inner_array *f() {
// like before ...
}
請注意,以表示abstact類型,沒有名字,你需要寫int(*)[5]
。那就是,你只是抹掉了這個名字。 (int*)[5]
是無效的語法。
你是對的 - 你不能返回int**
,因爲這意味着你有一個指向指針的指針。訪問f()[A][B]
將從返回的指針給出的地址讀取,然後再從該指針給出的地址依次讀取。但事實上,你返回的數組指針只指向一個內存塊,所以如果你做兩個間接指針,你會試圖重新解釋數據爲指針。
相反,如果您返回int(*)[5]
並執行f()[A][B]
,則不會從該指針返回的地址讀取任何值。相反,只需將偏移量A
添加到地址中,並將類型從int(*)[5]
調整爲int[5]
即可使數組引用調整後的地址處的內存。然後下一個索引再次被B
調整,並且因爲它在int*
上操作(然後在陣列衰減之後),而不是在數組指針上,它將讀取存儲在調整後的地址處的內容,最終產生int
。這是非數組指針和數組指針的重要區別。
如果需要,您可以試驗一下。考慮這兩個片段。一個可能會崩潰,但對方可能不會(但兩者產生不確定的行爲,因此這不應該在實際程序來完成)
int *pi = 0;
int(*pa)[5] = 0;
int i = *pi; // read int stored at null-pointer address!
int *a = *pa; // does not read any data from address, just adjusts the type!
struct thing {
int A[10][10];
};
typedef struct thing thing_t;
thing_t f1(void) {
thing_t t;
...
return t;
}
thing_t * f1(void) {
thing_t * tp;
...
return tp;
}
雖然,你真的要對這個錯誤的方法。
任何看到一些代碼的機會? – Goz 2010-03-27 11:15:38
請注意,採用'int * []'的函數實際上是採用'int **'。問題是二維數組不是'int **',也就是說,從一個函數返回二維數組將是正確的(因爲它表示內部數據),但不能用作函數的參數void(f * a [])' – 2010-03-27 11:36:29