2014-03-13 32 views
0

我想創建在具有未知的行數,我可以動態地在整個程序,但列的特定編號作爲8分配編譯時的2D陣列。如何與已知的號C實現動態2D陣列colums

喜歡的東西---->元素[8] [?];

+0

感謝您提供所有解決方案,我會盡量明天實施其中的一些解決方案,並瞭解哪種解決方案最適合我的應用,並選擇最佳解決方案。謝謝 ! – theForgottenCoder

回答

2

知道的列數,並使得只有行動態的數量您可以使用VLA或動態分配。甲VLA是直截了當:

int rows; 

// get rows somehow 

int table[rows][8]; 

牢記一個VLA具有自動存儲壽命,並且一旦封閉範圍到期將從尋址存儲器中刪除。他們不能成爲全局變量。

如果你的實現不支持VLA,自動存儲空間是一個問題,或者你需要一個全局變量來達到某種惡意目的,你必須動態管理它(這聽起來像是你想要做的) 。爲了做到這一點,聲明指針至8個元件的陣列,因爲這樣的:

int rows; 

// get rows somehow 

int (*table)[8] = malloc(rows * sizeof(*table)); 

其餘部分是直線前進。您可以在0..rows-1中引用table[i][j]i,在0..7中引用j。只記得在完成時釋放你分配:

free(table); 

,不要再引用它。

+0

經過仔細考慮,此方法最適合我的程序需求。 謝謝大家的回答! – theForgottenCoder

1

我會用這種方法去當尺寸是未知的。
假設數據類型爲int。

int* a; //this will point to your 2D array 

分配它,當你知道尺寸(ROW,COL):

a = malloc(sizeof(int)*ROW*COL); 

和訪問它像

a[ROW*i + j] = value // equivalent of a[i][j] 
+0

ooo這是相當整潔 – theForgottenCoder

+0

是的。 Upvote&接受如果你喜歡:) – brokenfoot

1

據我所知,你不能有foo[][8]C。您可能能夠通過製造結構和鑄造一個指針結構爲數組周圍破解,所討論的here,但畢竟是有些脆弱的黑客。

你可以做的是改變的行和列的定義,你的問題的空間,因此,爲了訪問行i,列j,你會做foo[j][i]而不是foo[i][j]。 在這種情況下,你可以宣佈你的陣列是這樣的:<typename> * foo[8]

+0

你*可以*擁有它,雖然語法不像你在這裏展示的那樣。它是'type(* foo)[8];'此外,所述變量有效地作爲函數參數聲明爲:'void func(type ar [] [8])''。 – WhozCraig

+0

嗯,我確實說過「據我所知」。我很高興通過發佈這個答案而學到了一些東西。 :) – merlin2011

0

我認爲當你不能在編譯時傳遞的任何值也不會被創建,我的建議是使用dynamic memory allocation因爲你不知道有多少行

3

如果你必須使用二維數組來代替數組列表中你會不得不作出一個陣列

constant i = 1 
foo[i][8] 

,並要展開陣列

make temp_foo[i][8] 
copy foo to temp_foo 
delete foo 
make foo[i++][8] 
copy temp_foo to foo 

每次但是,這使混亂。並且我認爲它更好,如果使用鏈表

struct node 
{ 
foo[8] 
node *next; 
} 

將第一要素

node *element_head 
element->foo = {add elements} 
element->next = null 

加入新的元素

node *temp 
temp->foo = {add element} 
temp->next = element_head 
element_head= temp