首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C中的字符串需要以null结尾?

为什么C中的字符串需要以null结尾?
EN

Stack Overflow用户
提问于 2010-02-08 19:49:21
回答 9查看 8.5K关注 0票数 23

只是想知道为什么会这样。我渴望了解更多关于低级语言的知识,而我只了解C语言的基础知识,这已经让我感到困惑。

像PHP这样的语言是否会在解释和/或解析字符串时自动将其空值终止?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-02-08 19:55:20

来自Joel's excellent article on the topic:

记住字符串在C中的工作方式:它们由一串字节组成,后面跟着一个值为0的空字符。这有两个明显的含义:

如果不遍历字符串,查找末尾的空字符,就无法知道字符串的结束位置(即字符串长度)。字符串中不能有任何零。因此,您不能在C字符串中存储像JPEG图片这样的任意二进制blob。为什么C字符串是这样工作的?这是因为在其上发明了UNIX和C编程语言的PDP-7微处理器具有ASCIZ字符串类型。ASCIZ的意思是“末尾带有Z(零)的ASCII。”

这是存储字符串的唯一方法吗?不,事实上,这是最糟糕的存储字符串的方法之一。对于重要的程序,API,操作系统,类库,你应该避免像瘟疫一样的ASCIZ字符串。

票数 29
EN

Stack Overflow用户

发布于 2010-02-08 19:53:05

C字符串是字符的数组,而C数组只是指向内存位置的指针,内存位置是数组的起始位置。但数组的长度(或结尾)也必须以某种方式表示;如果是字符串,则使用null终止。另一种选择是以某种方式将字符串的长度与内存指针一起携带,或者将长度放在第一个数组位置,或者其他任何位置。这只是一个惯例问题。

像Java或PHP这样的高级语言使用数组自动、透明地存储大小信息,因此用户不必担心它们。

票数 6
EN

Stack Overflow用户

发布于 2010-02-08 19:58:08

C本身没有字符串的概念。字符串是简单的字符数组(或者是unicode之类的wchars )。

由于这些事实,C没有办法检查字符串的长度,因为没有"mystring-> length ",所以没有在某个地方设置长度值。找到字符串末尾的唯一方法是遍历它并检查\0。

有用于C语言的字符串库,它们使用结构,如

代码语言:javascript
复制
struct string {
    int length;
    char *data;
};

为了消除对\0-终止的需要,但这不是标准的C。

像C++,PHP,Perl等语言都有自己的内部字符串库,这些字符串库通常有一个单独的长度字段,可以加快一些字符串函数的速度,并消除对\0的需要。

其他一些语言(如Pascal)使用一种名为(令人惊讶的) Pascal字符串的字符串类型,它将长度存储在字符串的第一个字节中,这就是为什么这些字符串的长度被限制为255个字符的原因。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2221304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档