2010-03-27 23 views
0

(gcc) Multi-Dim Array or Double Pointer for Warning-free Compile有關,有沒有辦法從函數返回所謂的「衰減數組指針」?總結(假設2 dim陣列)返回int (*a)[5]格式而不是int**格式?腐爛的多維數組返回功能

據我所知,返回時int**指針被髮送到另一個函數等待(int*)[]參數,它不能正常工作。

+0

任何看到一些代碼的機會? – Goz 2010-03-27 11:15:38

+0

請注意,採用'int * []'的函數實際上是採用'int **'。問題是二維數組不是'int **',也就是說,從一個函數返回二維數組將是正確的(因爲它表示內部數據),但不能用作函數的參數void(f * a [])' – 2010-03-27 11:36:29

回答

4

是的,但是語法不會好看

int(*f())[5] { 
    static int a[1][5] = { { 1, 2, 3, 4, 5 } }; 
    return a; 
} 

基本上,它只是你的af()(函數)代替。使用一個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! 
0
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; 
} 

雖然,你真的要對這個錯誤的方法。