[英]Why the difference in size when declaring a string in 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
時為strlen
9? 多余的3來自何處,它缺少空終止符?
而且我知道sizeof(s2)
比sizeof(s2)
大1個字節,因為s2將自動添加空字符嗎?
TIA,請保持溫柔!
char s2[] = "MyWord";
由於“”聲明,自動添加了空終止符。
s1
聲明沒有。 當您在s1
上執行strlen
,結果變成9,是因為它最終遇到\\ 0並停止了。 s1
不應與strlen一起使用,因為它不是以null終止的。 在s1上吃驚的可能是1,000。 如果打開內存沖突檢測,則s1的strlen將崩潰。
第一個缺少第二個中隱式\\0
終止符。 從而:
1
比第二,存儲器逐少 strlen
操作是未定義的行為(因為它沒有終止符) 如您所說,缺少終止空字符。
在s1
上調用strlen
函數時,它將對字符計數,直到找到終止的'\\0'
為止。 您可能會有不同的結果,具體取決於初始化內存的方式。
您對s2
定義實際上等於
char s2[] = { 'M', 'y', 'W', 'o', 'r', 'd', '\0' };
偶然情況下,s1只有9; 您只能在終止的字符串上使用strlen。 將其聲明為char s1 [] = {'M','y','W','o','r','d','\\ 0'}; 看看會發生什么。
strlen(s1)可以返回任何大於6的值,因為他正在搜索第一個'\\ 0'字符,而您沒有提供它。
在您的代碼中
s1
和s2
是char
數組。 s1
最后一個元素是d
,而s2
最后一個元素是\\0
。 也就是說, s2
還有一個字符。 它是一個以空值結尾的字符串,但s1
不是一個以空值結尾的字符串。
由於s1
不是以空值結尾的字符串,因此表達式strlen(s1)
將調用未定義的行為 ,因為strlen
將繼續讀取s1
到最后一個元素之外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.