2010-11-08 95 views
0

我爲什麼能做到字符數組聲明的問題

char identifier[4] = {'A', 'B', 'C', 'D'}; 

,而不是

char identifier[4]; 
&identifier = {'A', 'B', 'C', 'D'}; // syntax error : '{' 

,爲什麼我能做到

char identifier[4] = "ABCD"; // ABCD\0, aren't that 5 characters?? 

,而不是

char identifier[4]; 
&identifier = "ABCD"; // 'char (*)[4]' differs in levels of indirection from 'char [5]' 

這是個玩笑嗎?

+2

如果您需要將聲明與作業分開,您可以隨時執行此操作:'char identifier [4]; sprintf(標識符,「ABCD」);'。只要確保分配的字符串符合分配的數組或使用安全版本['sprintf_s'](http://msdn.microsoft.com/zh-cn/library/ce3zzk1k%28v=VS.100%29)。 ASPX)。 – 2010-11-08 19:25:56

+0

好的謝謝!這有效,但爲什麼我需要一個像這樣簡單的功能...... – Midas 2010-11-08 19:30:06

+1

@Jaime:你不覺得sprintf()在這種情況下可能是一個攻擊堅果的大錘嗎? memcpy()將足以*和*解決您爲sprintf_s()提出的問題。 – Clifford 2010-11-08 22:18:36

回答

2

三點:

  • 初始化不分配

  • 數組沒有一流的類型,因此不能進行分配。你必須分配單獨的元件(或使用函數如的strcpy()或的memcpy()。

  • 數組的地址是由陣列名稱設置在其自己的。

在你的最後一個例子,下面是一個有效的解決方案:

char identifier[4]; 
memcpy(identifier, "ABCD", sizeof(identifier)) ; 

不能使用的strcpy()在這裏,因爲這將需要5個字符數組允許NUL終止的錯誤信息有關的間接的水平是不是一個「玩笑」,它是你的錯誤;上述代碼中的註釋identifier沒有&運算符,因爲這會使其成爲char**,其中char*是必需的。

+0

+1 +1 +1 +1 +1 +1 +1 +1,但我會詳細說明一下「初始化不分配」意味着新手。 – 2010-11-08 19:38:56

+0

@Clifford,'數組的地址由數組名稱自己提供'是誤導性的,並教導錯誤的東西。我會去做類似於'通過自己的評估來使用數組名稱到第一個元素的地址'的東西。 – 2010-11-08 21:29:50

+0

@Jens:也許,我會讓它站立起來,因爲我認爲它很清楚。我明顯沒有說數組名*是一個指針。您的評論可能會對任何認爲有必要的人作出澄清。我試圖簡潔。 – Clifford 2010-11-08 22:12:59

3

您只能在聲明它時初始化數組。

至於char identifier[4] = "ABCD",這確實是可能的,但是語法被用來故意忽略尾隨的NUL字符。執行char identifier[] = "ABCD"以讓編譯器計算字符併爲您添加NUL()。

+0

在第二個代碼中,'&identifier'是一個指向數組的指針。 – 2010-11-08 19:17:58

+0

是的,我只是假設'&'語法是OP試圖發明一些做不到的事情。 – Arkku 2010-11-08 19:44:25

2

什麼Arkku說,而且,你不能指定的東西的地址,即&x = ...是從來沒有合法的。