2014-02-07 27 views
3

爲什麼這兩種初始化數組的方法彼此不同?爲什麼字符初始化差異? C

首先初始化給了我一個編譯器警告:

而第二個剛剛工作正常..

char *c_array_1[] = { {'a','b','c','d','e'}, {'f','g','h','i','j'} }; 

char *c_array_2[] = {"abcde","fghij"}; 
+2

一個區別是後者包含每個字符串中的終止NUL字符...您可能需要這樣做 – keshlam

+0

第一個字符不正確,因爲你說'T name [] = {e1,e2}'。在你的第一次初始化中,e1和e2是否真的與T類型('char *')兼容? e2'const char *',它可以隱式轉換爲'char *'。但是你仍然不允許改變這些元素。 – Brandin

回答

4

因此,在C語言中,字符串(如:"abcde")自動獲得存儲在編譯器的後臺爲它們分配。

所以,當你做

char *c_array_2[] = {"abcde","fghij"}; 

編譯器能夠在一定程度上改變這種狀況到:

char *c_array_2[] = {Some_Pointer, Some_Other_Pointer}; 

然而,對於其他例如:

char *c_array_1[] = { {'a','b','c','d','e'}, {'f','g','h','i','j'} }; 

的編譯器會嘗試初始化。這將導致該行代碼轉換爲以下(可能推出一些警告):

char *c_array_1[] = {'a', 'f'}; 

然後這肯定不是你想要的('a'很可能不是一個有效的指針,你可以看到一些關於爲什麼初始化會發生這樣的問題的更多信息:Why is this valid C

+3

更確切地說,它將第一個字符作爲int,然後嘗試將其轉換爲指針,然後它將剩餘多餘的元素。 –

+0

@ShafikYaghmour:你是完全正確的。我忘記了關於聚合初始化如何工作的正確規則。 –

+0

你能告訴我們爲什麼要把第一個char作爲int嗎? – Jan