2012-12-12 56 views
1

我試圖寫一個程序C99和我有隱含定義爲這樣一個字符串數組:在C99中如何爲隱式定義的多維數組分配內存?

char *stuff[] = {"hello","pie","deadbeef"}; 

由於陣列尺寸沒有定義,多少內存分配給每個字符串?是否所有字符串都與定義中的最大字符串分配相同數量的元素?例如,將這個以下代碼是等效於上面的隱式定義:

char stuff[3][9]; 
strcpy(stuff[0], "hello"); 
strcpy(stuff[1], "pie"); 
strcpy(stuff[2], "deadbeef"); 

或者是分配只是它需要在定義的時間的內存量每個串(即stuff[0]持有元素的數組,stuff[1]擁有一個數組元素元素,並且stuff[2]擁有一個數組元素)?

+1

數組衰減指針 - 但它們不是同一件事! –

回答

10

圖片可以提供幫助 - ASCII藝術很有趣(但很費力)。

char *stuff[] = {"hello","pie","deadbeef"}; 

+----------+   +---------+ 
| stuff[0] |--------->| hello\0 | 
+----------+   +---------+  +-------+ 
| stuff[1] |-------------------------->| pie\0 | 
+----------+   +------------+ +-------+ 
| stuff[2] |--------->| deadbeef\0 | 
+----------+   +------------+ 

分配用於指針的1D陣列的存儲器是連續的,但不能保證在陣列指向的存儲器鄰接的部分保持的指針(這就是爲什麼指針線具有不同的長度)。

char stuff[3][9]; 
strcpy(stuff[0], "hello"); 
strcpy(stuff[1], "pie"); 
strcpy(stuff[2], "deadbeef"); 

+---+---+---+---+---+---+---+---+---+ 
| h | e | l | l | o | \0| x | x | x | 
+---+---+---+---+---+---+---+---+---+ 
| p | i | e | \0| x | x | x | x | x | 
+---+---+---+---+---+---+---+---+---+ 
| d | e | a | d | b | e | e | f | \0| 
+---+---+---+---+---+---+---+---+---+ 

分配給二維數組的內存是連續的。 x表示未初始化的字節。請注意,stuff[0]是指向'hello'的'h'的指針,stuff[1]是指向'pie'的'p'的指針,並且stuff[2]是指向'deadbeef'的第一個'd'的指針(並且stuff[3]是'deadbeef'之後的空字節之外的字節的非可解引用指針)。

圖片相當不同。

注意,你可以寫以下任一:

char stuff[3][9] = { "hello", "pie", "deadbeef" }; 
char stuff[][9] = { "hello", "pie", "deadbeef" }; 

,你將有相同的內存佈局如圖2D陣列圖(所不同的是在x的將被清零)。

+1

只是美麗。 –

+0

這是對內存中發生的事情的極好解釋!儘管在C99標準中描述了這種行爲,但是有沒有人有參考? –

+1

6.2.6類型的表示。 –

2

在第一個例子中,它是一個鋸齒狀陣列我想。

它聲明一個char指針的數組。所以字符串文字可以像你喜歡的那樣長。字符串的長度爲獨立的數組列。

在第二個字符中,每行的字符數(string)長度必須爲9,如列大小指定的那樣,或者更小。

0

是否所有的字符串都被分配了與定義中最大的 字符串相同數量的元素?

不,只分配3個指針,它們指向3個字符串文字。

char *stuff[] = {"hello","pie","deadbeef"}; 

char stuff[3][9]; 

一點都相等。首先是3個指針的數組,而第二個是2D數組。

僅分配第一個指針,它們指向的字符串文字可能存儲在只讀部分。第二個分配在自動存儲上(通常是堆棧)。

4
char *stuff[] = {"hello","pie","deadbeef"}; 

多維數組!它只是一個指針數組。

爲每個字符串分配了多少內存?

字符數加上空終止符。與任何字符串文字相同。

我想你想要這樣的:

char foo[][10] = {"hello","pie","deadbeef"}; 

在這裏,10是每串空間量,所有的字符串都在連續的內存。因此,對於小於10的字符串將會有填充。