C - 为什么只有char数组null终止?

时间:2013-11-25 04:43:12

标签: c string

为什么char数组需要以NULL结尾?例如,为什么int数组不需要在末尾有分隔符?

6 个答案:

答案 0 :(得分:7)

char[]不必以NULL结尾。它是一种在使用char数组作为字符串时使用的约定。您可以将char []用于您自己的目的而不需要任何终止符。

答案 1 :(得分:6)

这是一个方便的问题。

ISO C标准的第7.1.1节以这种方式定义字符串

  

string 是由and结尾的连续字符序列   包括第一个空字符。

有许多可能的方法来表示字符串,例如使用计数和数组,或计数和指针。对于字符串文字和处理字符串的标准库函数,空终止恰好是为C选择的方式。

这很方便,因为空字符并不真正用于其他任何东西。它不可打印,它不是具有某些已定义显示行为的控制字符,例如以某种特定方式移动光标。

你可以拥有几乎任何东西的数组,但是使用零值来标记序列结尾的约定对于其他类型来说并不方便。对于整数或浮点类型,零是一个有效值,您可能希望将其作为数组中的普通数据。

指针 do 具有可用于标记序列结尾的可分辨值:空指针NULL。事实上它有时会以这种方式使用。 C程序的命令行参数作为指向字符串的指针序列传递;该序列的长度由终止空指针标记的argc 的值表示。另请参阅类似Unix的系统上的environ指针和exec*()函数。

(但对于某些应用程序,空指针也可以是有效值,因此不能用作终结符。)

字符串操作是C语言和库的重要组成部分,因此有一个如何表示字符串的约定是有意义的。该约定不适用于其他类型的数组。

(顺便说一下,重要的是要记住NULL是一个扩展为空指针常量的宏。使用名称NULL来引用null <是不正确的em> character '\0'。根据上下文,两者都可以在C源代码中表示为常量0,但它们是完全不同的东西。)

答案 2 :(得分:0)

您不需要将C char[]空终止,而是string。因为在Cstring表示空终止的字符数组\0 null终结符,这会告诉库该字符串在哪里结束。

<强>为什么吗

因为最初C作为具有低抽象的基本语言没有string作为数据类型string中的C只是{{1}的集合}}

为了使它更清晰,技术上是NO数据类型称为char,它只是一个为程序员可访问性实现的外观,使其成为一个高级概念,通常使用{{1的基本数据类型实现}}

答案 3 :(得分:0)

我使用NULL - 已终止intchar*struct等阵列很多次,我在其他代码中也看到了相同的解决方案。这是一种非常普遍的现象:)

但是:NULL终止字符串没有语言指令,至少在语言核心中没有,尽管一些标准C lib使用它(主要在<string.h>中)

答案 4 :(得分:0)

在C中,字符串的概念表示为NUL终止的数组{ - 1}}。因此,并非每个char数组都是NUL终止的;你可以拥有一个不代表字符串的数组。您可以拥有一个char数组,其中包含 not 表示终结符的NUL字节(因为该数组包含任意二进制数据且不代表字符串)。

您通常不会看到其他数组类型的终结符(sentinel值),因为通常情况下,您会使用什么值? sentinel值必须是不会用于数组的其他元素的值。你确实看到了一些特殊情况的哨兵价值;例如,使用char作为指针数组的标记值(例如NULL argv参数)有时是合理的。

至于为什么C字符串完全是NUL终止的(而不是Pascal样式的字符串),这是语言作者选择的设计。两种方法都存在权衡。另请参阅What's the rationale for null terminated strings?

答案 5 :(得分:-1)

在int数组中,数组元素永远不会一起用作字符串。但是,这是char数组的情况。通过使用null终止字符数组,您将能够将其用作字符串。