【问题标题】:Why is sizeof array(type string) 24 bytes with a single space element?为什么 sizeof 数组(字符串类型)是 24 个字节,带有一个空格元素?
【发布时间】:2019-04-30 20:30:59
【问题描述】:

我遇到了一个问题,我需要找到数组的大小来确定数组的长度。我的理解是一个字符是 1 个字节,一个字符串是 2 个字节('\0' 字符的一个额外字节)。

但是,我发现字符串数组的单个元素是 24 字节。

我输出了一个字符串、char 和 int 变量的大小来验证我的理解。我对 int、char 和 string 数组的单个元素做了同样的事情。

#include <iostream>

using namespace std;


int main()
{
    string strArr[1] = {" "};
    
    cout
        << sizeof " " << endl
        << sizeof strArr[0] << endl
        << sizeof strArr << endl << endl;
    
    char charArr[1] = {'a'};
    
    cout
    << sizeof 'a' << endl
    << sizeof charArr[0] << endl
    << sizeof charArr << endl << endl;
    
    int intArr[1] = {1};
    
    cout
        << sizeof 1 << endl
        << sizeof intArr[0] << endl
        << sizeof intArr << endl;
    
    return 0;
}

预期结果:

2
2
2

1
1
1

4
4
4

实际结果:

2
24
24

1
1
1

4
4
4

【问题讨论】:

  • string strArr[1] 是一个包含 1 个std::string 的数组。 strArr[0]std::string,而不是 char。最后,sizeofstd::string 是常量,不反映它包含的值的大小。
  • 使用.size() 获取std::string 的大小。使用sizeof 获取chars 在char 数组中的数量。
  • 你应该先阅读一点关于字符串的知识。字符串的大小取决于它的字符数,你可以通过 str.length() 得到它。如果您改用 char 数组,则应在数组末尾添加 '\0',这样可以使字符数 +1。
  • @HolyBlackCat 使用 std::size 而不是 sizeof 来获取数组 1 的长度。这样您(不是专门)就不会意外地获得您认为是指针的大小数组但是还没有学过调整函数参数和 2. 这样就不用考虑元素的大小了(以防以后碰巧用到wchar_t或者char32_t)。
  • sizeof 运算符给出对象的大小(数组/结构/类/等),而不是其内容。

标签: c++ arrays string


【解决方案1】:

为什么 sizeof array(type string) 是 24 字节和一个空格元素?

因为std::string 对象的大小是 24 字节(在您的系统上)。

我的理解是一个char是1个字节

正确。

一个字符串是 2 个字节(\0 字符是一个额外的字节)。

由 2 个char 对象组成的数组确实是 2 个字节。

但是,我发现字符串数组的单个元素是 24 字节。

您似乎混淆了“字符串”一词的不同含义。虽然字符串确实是一个字符数组,但std::string 不仅仅是一个字符数组。相反,std::string 是一个表示字符串的类。

更具体地说,std::string 是一个管理动态分配的字符数组的类。因此,字符串的大小必须至少是指向已分配内存的指针的大小。

猜你喜欢
  • 2021-08-22
  • 1970-01-01
  • 2021-09-19
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多