2011-05-31 30 views
2

如何獲取多維靜態數組的地址? 例如,這是我的數組獲取多維靜態數組的地址

char array[2][10] = {"word1", "word2"}; 

是否有可能得到的地址,讓我參考使用這樣的指針數組?我試過&數組或直接指針=(char **)數組;但在啓動時崩潰。

+1

'char ** pointer = array'就足夠了。如果它崩潰了,你就會在別的地方發現bug。你甚至不需要演員。 – hirschhornsalz 2011-05-31 21:22:43

+0

發佈您的代碼。 '指針=(char **)數組;'應該已經工作了,如果它崩潰了 - 還有其他一些問題。 – littleadv 2011-05-31 21:23:47

+0

嗯它崩潰了,因爲我引用第二個char *(word2)與「指針[0]」...而不是使用「指針」所有字符,直到'\ 0'被打印,因此我看到「word1」。但爲什麼是非法的? char **指針應該是一個char *數組,因此這個表達式「pointer [0]」不應該是非法的...... – Exor 2011-05-31 21:33:31

回答

5

char **pointer表示指針指向指針。 所以*pointer預計是一個指針(例如,可以解釋爲地址的4字節值)。

數組並非如此:它是內存中的一個連續區域(20個字節)。

因此,當您嘗試將數組轉換爲char **時,您的應用程序將崩潰。 這是不可能做這種轉換,char **必須指向一個指針。

+0

Peter Peter Der Linden對「Expert C Programming」的評價,他解釋了我認爲我已經知道的很多東西。 – 2011-05-31 21:41:36

+0

Right ...「array」可以被看作是一個簡單的char *指針,被編譯器視爲一個「有界」的矩陣。因此,我會錯誤地將這個數組賦值給一個指針數組。我應該自己初始化每個指針,這樣做?' \t char arr [2] [20] = {「word1」,「word2」}; \t char ** pointer = new char * [2]; \t pointer [0] = arr [0]; \t指針[1] = arr [1];' – Exor 2011-05-31 21:54:49

+0

@Exor:是的,那可行。但它必須「手動」完成,沒有自動轉換,因爲類型不兼容。 – 2011-05-31 22:18:53

2

「array」是數組在內存中的地址,但它不是char **。雖然你可以投它,如果你嘗試

printf("%s", pointer[1]); 

,因爲你的情況可能是一樣的

printf("%s", (char *)(0x00000031)); 

因爲指針[1]的意思是」第二個4字節的指針(假定該應用程序會崩潰x86)從'array'開始。 指針[0]可能不會崩潰,但不會出於同樣的原因顯示「word1」。

你可能想(這是很難remeber,所以我不得不在網上查詢,希望這是正確的):

char (*pointer)[10] = array; 

這是一個指向10個字符數組。如果你使用指針[1],它現在意味着「從'數組'開始的第二個10個字符塊」。