当我运行此代码时,无论字符串是啥,结果始终为 24。为啥? [复制]

Posted

技术标签:

【中文标题】当我运行此代码时,无论字符串是啥,结果始终为 24。为啥? [复制]【英文标题】:When I run this code, result is always 24 regardless of what string is. Why? [duplicate]当我运行此代码时,无论字符串是什么,结果始终为 24。为什么? [复制] 【发布时间】:2021-09-07 14:39:52 【问题描述】:

当我运行这段代码时,无论字符串是什么,结果总是 24。为什么?

#include <bits/stdc++.h>
using namespace std;
    
int main()

    string s = "asdccccc";
    cout << sizeof(s);
    return 0;

【问题讨论】:

要获取字符串的大小,请使用cout &lt;&lt; s.size();(或cout &lt;&lt; s.length(); ...它们是同义词)。当您执行sizeof(s) 时,您获取的不是字符串有效负载的大小,而是拥有有效负载的字符串对象的大小。 @Caleth 我应该知道这是重复的,谢谢。 如果你使用#include &lt;string&gt;,你的编译效率会更高,这是一个单一的包含文件版本,不标准的庞然大物bits/stdc++.h。通常,只在代码或标头中包含实际解析符号的标头。 【参考方案1】:

string 是一个对象。通过使用sizeof,您将获得该对象的成员 的大小。其中一个成员可能是指向实际字符串内容的指针,但无论指针指向什么,指针的大小都是恒定的。

【讨论】:

我尝试在其他编译器上运行它...答案不是 24 但它仍然是一个常数,无论字符串的大小如何...所以指针的大小会随着编译器的变化而变化? ? @ChiragJoshi std::string 类的定义随着标准库的实现而改变。指针的大小在编译器之间不会改变,但会在不同的 CPU 架构之间发生变化(并且 x86 支持具有不同大小指针的多种模式)。 @ChiragJoshi 它可能是指针的大小,特别是如果一个是 32 位而另一个是 64 位。也可以是其他成员的数量和类型。【参考方案2】:

考虑这个简单的例子

class string

    const char* _ptr;
    ....
    ....
public:
   

当你写sizeof(string)时,你会得到类的大小,而不是_ptr指向的字符串字面量的大小。

【讨论】:

以上是关于当我运行此代码时,无论字符串是啥,结果始终为 24。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致此运行时错误 13“类型不匹配”?

描述无论运行多少次都会产生相同结果的过程的正确术语是啥?

以下Java代码执行结果是啥,请详细分析为啥?

未初始化的 int 值始终相同 (C++)

HttpServletRequest 参数映射始终为空 [关闭]

神经网络输出始终为 1