2012-11-12 53 views
1

在C++中,如果我做的:字符陣列分配

char myArray[] = {'1','2','3','4','5','6','7','8','9'}; 

這是否分配10個空格?最後一個元素是'/ 0'?

什麼:

char myArray[9] = {'1','2','3','4','5','6','7','8','9'}; 

我是不是在這種情況下,只分配9位?這不好嗎?

char myArray[10] = {'1','2','3','4','5','6','7','8','9','/0'}; 
+1

'/ 0'可能不是你的意思:它是一個多字符文字,其值是實現定義的。嘗試使用'\ 0'代替。 –

回答

9
char myArray[] = {'1','2','3','4','5','6','7','8','9'}; 

這是否分配10個空格:

最後,當我這樣做會發生什麼?最後一個元素是'/ 0'?

9號


char myArray[9] = {'1','2','3','4','5','6','7','8','9'}; 

我是不是在這種情況下,只分配9位?

是的。

這是不好的?


最後,當我做

char myArray[10] = {'1','2','3','4','5','6','7','8','9','/0'}; 

假設你的意思是'\0',究竟是什麼樣子會發生什麼。

在這些情況下沒有任何魔法—你正是你所要求的。

自動空終止的東西,進場字符串文字

char myArray1[10] = "123456789"; 
char myArray2[9] = "123456789"; // won't compile - wrong size 
char myArray3[] = "123456789"; // still 10 elements - includes null terminator 
+2

沒有看起來像什麼,因爲''/ 0'是一個多字節字符文字,它不是'char'類型,所以它將被轉換爲'char'類型。可能這會溢出和奇怪的東西,或者如果'char'被簽名則爲UB;我不知道確切的規則。 – rightfold

+1

聽起來很愚蠢,我無法想象這個奇怪的問題更好的答案... –

+0

@Aardvark:哈,真的。確定它。 –

3

不,你只會得到使用時,字符串文字,即尾隨NUL

// Array of 10 bytes 
char myArray[] = "123456789"; 

// same as: 
char myArray[] = {'1','2','3','4','5','6','7','8','9','\0'}; 
1
char myArray[] = {'1','2','3','4','5','6','7','8','9'}; 

這隻分配9個元素。

char myArray[9] = {'1','2','3','4','5','6','7','8','9'}; 

是的,這一行還分配了9個元素。

char myArray[10] = {'1','2','3','4','5','6','7','8','9','/0'}; 

最後一個應該是'\0'而不是'/0'

你所想應該是

char myArray[] = "123456789"; 

其(在字符串的結尾文字1拖尾'\0')分配10個字符

1

char陣列不行爲不同於其他任何數組,當你使用列表初始化。你會想到

int x[] = {1,2}; 

神奇地追加0作爲最後一個元素,使x有3個要素是什麼?

如果你提供較少的元素,那麼最後的是值初始化,所以

char myArray[10] = {'1','2','3','4','5','6','7','8','9'}; 

將是空值終止,但

char myArray[9] = {'1','2','3','4','5','6','7','8','9'}; 

不是。

+3

你的第二個代碼片段只有0,而不是'\ 0'。 – Gaminic

+2

@Gaminic他們不同如何?八進制'0'與char'\ 0'相同。 –

+0

@Gaminic:如果你是downvoter,你只是低估了100%正確的職位。恥辱! –