2012-05-20 32 views
1

我應該知道這一點,但我沒有,我認爲它可能是我基礎知識的一個重大缺口,所以我想我應該問問專家。爲什麼在C++中聲明字符串時大小的差異?

考慮:

char s1[] = { 'M', 'y', 'W', 'o', 'r', 'd' }; 
char s2[] = "MyWord"; 

cout << strlen(s1)<<endl; 
cout << strlen(s2)<<endl; 

cout << sizeof(s1)<<endl; 
cout << sizeof(s2)<<endl; 

爲什麼作爲s1聲明時是strlen 9但s2申報時爲6?額外3來自哪裏,它缺少一個空終止字符?

我知道sizeof(s2)sizeof(s2)大1個字節,因爲s2會自動添加空字符?

請溫柔,TIA!

回答

7

char s2[] = "MyWord";由於「」聲明,自動添加空終止符。

s1聲明不。當你在s1上做一個strlen,它出現在9上,這是因爲它最終碰到一個\ 0並停下來。 s1不應該與strlen一起使用,因爲它不是空終止的。 s1上的strlen本可以是1,000。如果你打開內存違規檢測s1的strlen會崩潰。

7

第一個缺少第二個存在的隱式的\0終止符。因此:

  • 第一比第二1以下,存儲器明智
  • 在第一否則strlen是未定義的行爲(因爲它缺少終止子)終止空字符的
+0

嘿,s2的大小是否意味着終止字符*** \ 0 ***是一個字節?謝謝 –

+0

是的,在C和C++中'char'總是1個字節。 – cnicutar

2

缺乏作爲你說。

當在s1上調用strlen函數時,它會對字符進行計數,直至找到終止的'\0'。根據內存初始化的方式,您可能會得到不同的結果。

你的s2定義實際上相當於

char s2[] = { 'M', 'y', 'W', 'o', 'r', 'd', '\0' }; 
2

S1只有9由偶然事件;你只能在終止的字符串上使用strlen。聲明爲char s1 [] = {'M','y','W','o','r','d','\ 0'};並看看會發生什麼。

1

strlen(s1)可以返回任何> 6的值,因爲他正在搜索第一個'\ 0'字符並且您沒有提供它。

1

在你的代碼,

  • s1s2char陣列。
  • s1最後一個元素是d,而s2最後一個元素是\0

也就是說,在s2中還有一個字符。它是以空字符結尾的字符串,但s1不是以空字符結尾的字符串。

由於s1不是一個空結束的字符串,表達strlen(s1)將調用未定義行爲,如strlen將繼續閱讀s1超出了最後一個元素。