簡體   English   中英

在C ++中如何比較字符數組與字符串的大小?

[英]In C++ How do I compare the size of a character array vs string?

我有以下聲明

char c[] = "Hello";
string c2 = "Hello";

我想比較a)需要多少字節的內存和b)字符長度。 我知道字符數組在字符串的末尾添加一個空終止符,而不是字符串數據類型。

運用

cout << "The sizeof of c: " << sizeof(c);
cout << "The sizeof of c2: " << sizeof(c2);

返回6和4,我不知道為什么4而不是5? 長度函數如何在這里比較...

當我使用以下代碼時

cout << "The sizeof of c: " << sizeof(c);
cout <<"The sizeof of c2: " << c2.length();

我得到6和5 ......但它是否以相同的方式比較長度? 謝謝。

a)有多少記憶需要和

您正確使用了sizeof運算符來確定字符數組占用的字節數。

它是

sizeof( c )

對於std::string類型的對象,它占用兩個內存區。 第一個用於分配對象本身,第二個用於分配對象保存的字符串。

所以

sizeof( c2 )

將給出對象占用的內存大小。

c2.capacity()

將為您提供分配用於存儲字符串的對象的大小,以及將來可能填充的一些其他字符。

當我使用下面的代碼cout <<“c的sizeof:”<< sizeof(c); cout <<“c2的sizeof:”<< c2.length();

我得到6和5

如果你想比較字符串本身沒有字符數組有的終止零,那么你應該寫

cout << "The length of c: " << std::strlen(c);
cout <<"The length of c2: " << c2.length();

你會得到結果5和5。

您可以使用std :: string類型的對象進行以下實驗。

std::string s;

std::cout << sizeof( s ) << '\t' << s.capacity() << '\t' << s.length() << std::endl;

std::string s1( 1, 'A' );

std::cout << sizeof( s1 ) << '\t' << s1.capacity() << '\t' << s1.length() << std::endl;

std::string s3( 2, 'A' );

std::cout << sizeof( s2 ) << '\t' << s2.capacity() << '\t' << s2.length() << std::endl;

std::string s3( 16, 'A' );

std::cout << sizeof( s3 ) << '\t' << s3.capacity() << '\t' << s3.length() << std::endl;

sizeof(c)是數組的大小,它包含初始化它的文字中的五個字符,加上末尾的零值終結符,總共有六個字節。

sizeof(c2)string類的大小,它不會告訴你任何特別有用的東西。 該類管理包含字符串字符的動態分配的內存; 這不是string對象本身的一部分。

c2.length()是由c2管理的字符串中的字符數; 五個字符。

a)需要多少字節的內存,以及b)字符長度

  • 變量'c'在堆棧上使用6個字節(5個字母和空終止符)

  • sizeof(c)= 6,strlen(c)= 5

  • 所需內存總字節數:6


  • 如果'c'有1000個字符,

    • sizeof(c)= 1001,strlen(c)= 1000)
  • 所需內存總字節數:1001


  • 變量'c2'在堆棧上使用4個字節(我懷疑是一個指針,但尚未確認),並且在其他地方至少有5個字節(我認為堆)。

  • sizeof(c2)= 4,c2.size()= 5,strlen(c2.c_str())= 5

  • 所需內存總字節數:9+(4 + 5)+


  • 如果'c2'有1000個字符,即c2.size()== 1000

  • 堆棧上有4個字節,和

  • 在其他地方至少1000字節(取決於實現,可能還有一些)

  • 所需內存總字節數:1004+

注意:std :: string是一個容器。 我認為這些值沒有指定,應該被認為是依賴於實現的。

我猜[]的大小包括終止空字符,因此5 + 1 = 6個字節。

字符串對象的大小返回4個字節,這可能是指向字符串對象的指針的大小。 32位。

在最后一種情況下,您正在使用編程的長度來計算字符數。

那么c[] = "Hello"的大小是6,因為char數組需要為null \\0字符分配1個以上的內存字節。

length()函數返回字符串文字中的字符數。計數時不包含null \\0字符。

std::string ,如std::unique_ptrstd::shared_ptrstd::vector ,是一個智能指針加上一些額外的操作成員函數。

當你將一個傳遞給sizeof ,你要測量智能指針的大小 - sizeof (std::string) ,而不是內容。

暫無
暫無

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

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