只是想知道为什么会这样.我渴望了解更多有关低级语言的知识,而且我只是进入C语言的基础知识,这已经让我感到困惑.
像PHP这样的语言会在解释和/或解析时自动为null终止字符串吗?
来自Joel关于这个主题的优秀文章:
记住字符串在C中的工作方式:它们由一串字节后跟一个空字符组成,其值为0.这有两个明显的含义:
没有办法知道字符串结束的位置(即字符串长度)而不移动它,在末尾查找空字符.您的字符串中不能包含任何零.因此,您无法在C字符串中存储任意二进制blob,如JPEG图片. 为什么C字符串以这种方式工作?这是因为发明了UNIX和C编程语言的PDP-7微处理器具有ASCIZ字符串类型.ASCIZ的意思是"最后用Z(零)的ASCII".
这是存储字符串的唯一方法吗?不,实际上,这是存储字符串的最糟糕方式之一.对于非平凡的程序,API,操作系统,类库,您应该避免像瘟疫这样的ASCIZ字符串.
C字符串是字符数组,C数组只是指向内存位置的指针,它是数组的起始位置.但也必须以某种方式表达数组的长度(或结束); 在字符串的情况下,使用空终止.另一种选择是以某种方式携带字符串的长度与存储器指针一起,或者将长度放在第一个数组位置,或者其他什么.这只是一个惯例问题.
Java或PHP等高级语言可以自动,透明地存储数组的大小信息,因此用户无需担心它们.
C本身没有字符串的概念.字符串是简单字符的阵列(或wchars为Unicode和这样).
由于这些事实,C无法检查字符串的长度,因为没有"mystring-> length",因此没有设置长度值.找到字符串结尾的唯一方法是迭代它并检查\ 0.
C的字符串库使用类似的结构
struct string { int length; char *data; };
删除\ 0-termination的需要,但这不是标准C.
像C++,PHP,Perl等语言有自己的内部字符串库,它们通常具有单独的长度字段,可以加速某些字符串函数并消除对\ 0的需要.
其他一些语言(如Pascal)使用一种被称为(令人惊讶的)Pascal String的字符串类型,它将长度存储在字符串的第一个字节中,这就是为什么这些字符串限制为255个字符的长度的原因.