在C ++中如何比较字符数组与字符串的大小?

时间:2014-09-08 17:02:01

标签: c++ arrays string size character

我有以下声明

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 ......但它是否以相同的方式比较长度? 感谢。

6 个答案:

答案 0 :(得分:8)

  

a)有多少记忆需要和

您正确使用了sizeof运算符来确定字符数组占用的字节数。

sizeof( c )

对于类型std::string的对象,它占用两个内存区。第一个用于分配对象本身,第二个用于分配对象所持有的字符串。

所以

sizeof( c2 )

将为您提供对象占用的内存大小。

c2.capacity()

将为您提供分配用于存储字符串的对象的大小,以及将来可能填充的一些其他字符。

  

当我使用以下代码cout&lt;&lt; “c的大小:”&lt;&lt;   的sizeof(C); cout&lt;&lt;“c2的大小:”&lt;&lt; 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;

答案 1 :(得分:3)

sizeof(c)是数组的大小,它包含用它初始化的文字中的五个字符,加上末尾的零值终结符,总共有六个字节。

sizeof(c2)string类的大小,它不会告诉您任何特别有用的内容。该类管理包含字符串字符的动态分配的内存;这不是string对象本身的一部分。

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

答案 2 :(得分:2)

  

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是一个容器。我认为没有指定这些值,        并应视为依赖于实现。

答案 3 :(得分:1)

我猜[]的大小包括终止空字符,因此5 + 1 = 6个字节。

字符串对象的大小返回4个字节,这可能是指向字符串对象的指针的大小。 32位。

在最后一种情况下,您正在使用编程的长度来计算字符数。

答案 4 :(得分:0)

c[] = "Hello"的大小是6,因为char数组需要再分配1个字节 内存为\0个空字符。

length()函数返回字符串文字中的字符数。计数时不包含空\0字符。

答案 5 :(得分:0)

std::string,如std::unique_ptrstd::shared_ptrstd::vector,是智能指针加上一些额外的操作成员函数。

当您将一个传递给sizeof时,您需要测量智能指针的大小 - sizeof (std::string),而不是内容。