【问题标题】:Why does a C++ string end in a null terminator? [duplicate]为什么 C++ 字符串以空终止符结尾? [复制]
【发布时间】:2011-11-05 10:02:06
【问题描述】:

可能重复:
What's the rationale for null terminated strings?

我的问题很简单:为什么 C++ 字符串以空终止符结尾?这样是不是就不用计算长度了?

【问题讨论】:

标签: c++


【解决方案1】:

C 和 C++ 中的传统字符串使用空终止符来指示字符串的结尾。由于字符串指针只是指向一个字符数组,没有任何长度或其他元数据,因此空终止符是确定字符串长度的唯一方法。

至于为什么这样做,这是一个更难回答的问题。存储字符串数据的方式有很多种,这只是其中一种。

【讨论】:

  • AFAIK 当时的基本原理是“如果我们预先存储一个固定大小,它应该是多少字节?”。一个会非常有限,两个不会更好,但对于短字符串来说会很浪费。
【解决方案2】:

有两种存储原始字符串的基本技术,一种将长度存储在标题中,另一种使用零终止符作为结尾。

C 语言的设计者选择后者。这就是为什么。 C++ 只是继承了这个,std::string 使用了这种技术,所以c_str() 是 O(1)。注意:我不知道标准是否需要这个,甚至不在乎。

【讨论】:

    【解决方案3】:

    字符串可以被认为是一个可变长度的字段。将计数保存在某处需要某种格式,例如首先存储长度,然后存储字符串(如 ID3v2 标签中的帧头)。保留终止符来标记可变长度字段的结尾是另一种方法。 C 已经选择这种方式来标记字符串字段的终止。取决于我们如何解释位和字节的序列。

    【讨论】:

      【解决方案4】:

      不是官方答案,但我可以推测 C(以及后来的 C++)字符串以零结尾的原因是因为如果加载到内存中的值为零(空终止符),它只需要一条机器指令即可分支。那,它只有一个字节,而不是限制为 255 个字符而不添加另一个字节的 Pascal 字符串。

      【讨论】:

        猜你喜欢
        • 2010-11-18
        • 1970-01-01
        • 2018-09-16
        • 2011-06-06
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多