2014-10-26 52 views
2

有沒有方便的方法來創建一個矩陣而不使用malloc?這種作品:C可變尺寸行的二維數組

int *arr2d[3]; 
int arr0[] = { 0 }; 
int arr1[] = { 0, 1 }; 
int arr2[] = { 0, 1, 2 }; 

arr2d[0] = arr0; 
arr2d[1] = arr1; 
arr2d[2] = arr2; 

printf(%d, arr2d[i][j]); 

它不會讓你遍歷值容易因爲你可以使用arr2d的sizeof你不能讓每個子陣列的大小[3] [3]。

sizeof arr2d[i]/sizeof arr2d[i][0] 

有沒有更好的方法來做到這一點?

作爲參考,在這裏是同一種對C的問題++:

C++ 2 dimensional array with variable size rows

回答

1

使用結構和複合文字只能在堆棧上完成。

typedef struct 
{ 
    size_t size ; 
    int* a ; 

} jag_array ; 

jag_array m[] = { { 3 , (int[]){ 1,2,3 } } , 
        6 , (int[]){ 1,2,3,4,5,6 } , 
        4 ,(int[]){ 1,2,3,4 } } ; 

這有侷限性。當您複製結構時,數組本身不會被複制。

單獨的函數和宏可以幫助處理這個問題,但它並不那麼漂亮。

+0

我對這種方法感到不安的是,尺寸是如何從字面數組中得到的字面數。這是對數組文字進行更改時忘記修改大小的錯誤邀請。我盡力避免這種情況,即使它能正常工作。 – cmaster 2014-10-26 20:45:08

+0

發現笨拙不得不寫m [i] .a [j],有沒有辦法避免這種情況? – Forss 2014-10-26 20:50:08

+1

@Forss使用函數。 – 2501 2014-10-26 20:50:31

2

你不能做到這一點:在這種情況下,sizeof是靜態評估,以及它所代表的指針的大小。如果您需要實現每行有不同的大小交錯數組,你有兩個選擇:

  • 時候可以從該行指數來計算的大小,例如在像你這樣的「三角形」陣列中(陣列長度爲row+1),根本不存儲任何東西
  • 當大小是任意的時,創建一個單獨的數組size_t len[rows],並分別存儲每個長度。