2012-04-19 81 views
2

我試圖不提的尺寸來創建2d array像如下創建一個整數2D陣列(相比於一個字符串二維數組):而不提尺寸

int m1[][] = {{1,2}, {3,4}}; 

編譯時,我得到以下錯誤:

error: array type has incomplete element type 

是沒可能不提row和創建的stack(而不是動態內存分配上heap)一?

如果編譯器無法確定整數2d數組的維數,它如何確定字符串2d數組的空間要求。例如,

char *keywords[] = {"auto", "static", "extern", "volatile"}; 
+0

經過一番事後的思考,我不得不這樣說:**不要懶惰!**您只需要放置_two_數字;其實你只需要_一個!當你已經寫出整個數組時,這真的是一筆大交易嗎? – Anthales 2012-04-19 20:14:56

+0

@Anthales我剛剛做到了! ;) – 2012-04-19 20:42:32

+0

其實,我在閱讀完之後這樣做了 - http://www.ibiblio.org/pub/languages/fortran/append-c.html – 2012-04-19 20:43:21

回答

2

您可以省略外部維度,但不是內部維度。所以這是好的

int m1[][2] = {{1,2}, {3,4}}; 

你的第二個問題:char *keywords[]不是一個二維數組!這是一個指針數組。指針不是數組;數組不是指針! (僅當數組衰減時,指向數組的第一個元素的指針(如果用作右值)。

更新:實際回答您的問題:字符串通常會在只讀存儲中靜態「分配」(例如直接寫入對象文件/您的程序中)。因此,將陣列聲明爲char *[]也是錯誤的 - 它應該是const char *[]

2

正確的,B/C編譯器會一個)沒有確定多少空間分配的方法和b)不具有確定其中給定的元件位於陣列內的方式。

+0

編譯器_could_檢查所有內部列表的大小是否相同,然後將其作爲內部維度 - 只是,編譯器是懶惰的(並且標準沒有強制執行,或者說是允許這樣做)。 – Anthales 2012-04-19 19:34:22

+0

@Anthales他們不懶惰,這是完全有效的代碼:'int m1 [] [3] = {{1,2},{3,4}};' – Fozi 2012-04-19 19:48:50

+0

是的,這是有效的。我不是在爭論。你爲什麼認爲我在爭論呢? – Anthales 2012-04-19 19:49:33