为什么需要空终止符?

时间:2013-06-28 18:15:38

标签: c++ string null terminator

在过去的几天里,我一直在教自己c ++,为我作为CS专业的新生一年做准备。我现在正在使用C风格的字符串,并想知道空终结符的意义是什么。

我知道这是必要的,但我想我只是没有从根本上理解为什么字符串不会以最后一个字符结束。

4 个答案:

答案 0 :(得分:17)

  

我只是没有从根本上理解为什么字符串不会以最后一个字符结束。

有几种方法可以知道“最后一个字符”在哪里:

  1. 将字符串中的字符数与字符串的字符分开存储
  2. 放置一个标记,指示字符串的最后一个字符,或
  3. 将指针与字符串的字符分开存储到字符串的最后一个字符。
  4. C选择第二条路线;其他语言(Pascal等)选择第一条路线。 C ++ std::string的一些实现选择第三条路径 *

    <小时/> * 即使使用第一种或第三种方法的std::string实现也会使其缓冲区终止,以便与库的C部分兼容。这是确保c_str()返回有效C字符串所必需的。

答案 1 :(得分:2)

在C和C ++中,c字符串存储在字符数组中。为了允许不同长度的字符串,这些数组的分配通常比它们要包含的实际字符串大得多。例如,程序员可以分配一个char[256]数组,该数组可以保存一个长度在0到255之间的字符串。但是计算机必须能够确切地知道字符串实际有多长,所以它必须以null字符结尾。否则,字符数组长度必须与字符串完全相同(这是一种不切实际的解决方案,因为分配和复制内存会占用大量资源)。

答案 2 :(得分:0)

因为c样式字符串不知道哪个字符是最后一个字符。例如,如果您正在读取名称,则可以创建一个缓冲区:

char buf[256] // this allows c-style strings that contain 255 characters

但是当你去填充那个缓冲区时,你可能不会(可能不会)使用所有的空间。如果你用“杰克”填充它,你关心的唯一信息是前五个索引,而不是全部256个。

答案 3 :(得分:0)

将字符串的每个字符视为内存中的内存块。 如果字符串放在内存中。之后,另一个字符串放在它旁边,如果没有null,计算机将认为第二个字符串连接到1st。因此,null充当分隔符