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

Ice*_*man 8 c string

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

Joh*_*136 7

char[]不必被NUL终止.当您想要将char数组用作字符串时,它是一种约定.您可以将char []用于您自己的目的,而无需任何终止符.

  • @ v.oddou:*字符串*准确无误.该术语在C标准的7.1.1中定义:"A*string*是由第一个空字符终止并包括第一个空字符的连续字符序列." (2认同)

Kei*_*son 6

这是一个方便的问题.

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

是由封端的字符的连续序列,并且包括第一个空字符.

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

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

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

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

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

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

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