c++中的sizeof显示字符串大小少一个

sizeof in c++ showing string size one less

本文关键字:一个 sizeof 中的 显示 字符串 c++      更新时间:2023-10-16

在C++中,我试图获得string的大小,比如"gibbs";

当我使用sizeof函数时,它返回的大小小于实际大小的一。

我有以下代码:

 string s = "gibbs";
 cout << sizeof(s) <<endl;

输出为:4。我想应该是5。

如何解决此问题。我们可以总是在sizeof的返回中添加+1,但这会是完美的解决方案吗?

sizeof(s)提供对象s的大小,而不是存储在对象s中的字符串的长度。

你需要写这个:

cout << s.size() << endl;

注意,std::basic_string(以及扩展为std::string)具有size()成员函数。std::basic_string还有一个length成员函数,它返回与size()相同的值。所以你也可以这样写:

cout << s.length() << endl;

我个人更喜欢size()成员函数,因为标准库中的其他容器,如std::vectorstd::liststd::map等,都有size()成员函数,但没有length()。也就是说,size()是标准库容器类模板的统一接口。我不需要专门为std::string(或任何其他容器类模板)记住它。成员函数CCD_ 20在这个意义上是一个偏差。

sizeof(s)在您的示例中返回std::string的大小,与其成员指向的内容无关。

如何解决此问题。我们可以总是在sizeof的返回中添加+1,但这会是完美的解决方案吗?

不,这不会解决任何问题,因为值是常量,并且sizeof没有提供您期望的值。

如果您想知道字符串的字符序列所需的字符数,可以使用s.length()s.size()——在该值上加1来知道终止字符串所需的大小。

还要注意,sizeof的值不会在库和平台之间保持一致。CCD_ 27的实现方式可能有很大差异。特别是,您可能会看到指针大小的差异,也可能会看到小字符串优化。

因为这是系统中字符串类型的大小,而不是底层数据的大小。例如:

#include <iostream>
int main (void) {
    std::string s1 = "gibbs";
    std::string s2 = "a much longer string";
    std::cout << sizeof(s1) << 'n';
    std::cout << sizeof(s2) << 'n';
    std::cout << s1.length() << 'n';
    std::cout << s2.length() << 'n';
    return 0;
}

生产:

4
4
5
20

换句话说,您应该使用std::string::length()来获取字符串的长度。

sizeof返回对象类型std::string的大小,在您的系统中恰好是4。这可能是因为您正在处理的std::string的实现使用了pimpl习惯用法,即它只包含一个指向您正在查找的实际实现的指针,而指针在您的主机环境中恰好是32位的。不过,更有可能的是,您使用的是std::string的写时复制实现,它不再符合C++11标准的规范。

std::string被定义为std::basic_string模板类,特别是std::basic_string<char>的专门化;您应该查看std::basic_string上的文档。看看CCD_ 38和CCD_。

std::string s = "stackoverflow";
std::assert(s.size() == 13);