字符串的长度是怎么样的?
一般的说,有两种类型的字符串数据类型:“定长字符串”,它有固定的极大长度并且不管是否达到了这个极大值都使用同样数量的内存;和“变长字符串”,它的长度不是专断固定的并且依赖于实际的大小使用可变量量的内存。
在现代编程语言中的多数字符串是变长字符串。尽管叫这个名字,所有变长字符串还是在长度上有个极限,一般的说这个极限只依赖于可获得的内存的数量。
可以使用特殊的终止字符隐式存储字符串的长度;这通常是空字符(NUL),它的所有位都为零,这是流行的C 编程语言使用和延续的约定。因此,这种表示通常被称为C 字符串。这种n字符字符串的表示占用n + 1 个空格(1 表示终止符),因此是一个隐式数据结构。
在终止字符串中,终止代码不是任何字符串中允许的字符。带有长度字段的字符串没有这个限制,也可以存储任意二进制数据。
长度前缀
字符串的长度也可以显式存储,例如通过在字符串前面加上长度作为字节值。这种约定用于许多帕斯卡方言;因此,有些人称这样的字符串为Pascal 字符串或P-string。
将字符串长度存储为字节会将最大字符串长度限制为 255。为避免此类限制,P 字符串的改进实现使用 16、32 或 64 位字来存储字符串长度。当长度字段覆盖地址空间时,字符串仅受可用内存的限制。
如果长度是有界的,那么它可以在常量空间中编码,通常是一个机器字,从而导致一个隐式数据结构,占用n + k空间,其中k是一个字中的字符数(8 表示 8 位ASCII 在 64 位机器上,1 代表 32 位 UTF-32/UCS-4 在 32 位机器上,等等)。