簡體   English   中英

為什么在C ++中聲明字符串時大小不同?

[英]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;

為什么當聲明為s1strlen 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'字符,而您沒有提供它。

在您的代碼中

  • s1s2char數組。
  • s1最后一個元素是d ,而s2最后一個元素是\\0

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

由於s1不是以空值結尾的字符串,因此表達式strlen(s1)將調用未定義的行為 ,因為strlen將繼續讀取s1到最后一個元素之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM