A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© AndyWang 中级黑马   /  2014-7-19 23:20  /  1363 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看到字符串 视频中MJ老师说字符串以数组存储时在末尾会有一个隐藏字符 '\0' 有点不懂 要是字符数组长度等于字符串中字符的个数 那这个'\0' 存在哪呢?

10 个回复

倒序浏览
首先要明确,'\0'也是一个字符,就存在字符数组中,因此字符数组的长度包括这个'\0'。但字符串长度则不计这个'\0'。这就是个定义问题。记住就好
回复 使用道具 举报
这样的话会溢出,报错。找个编译器试一下就知道了。
回复 使用道具 举报
fantacyleo 发表于 2014-7-19 23:39
首先要明确,'\0'也是一个字符,就存在字符数组中,因此字符数组的长度包括这个'\0'。但字符串长度则不计这 ...

嗯 谢谢 能具体说明下吗 比如 char name[2] = "it" ; 在这个字符串中  '\0' 是怎样存储的呢?
回复 使用道具 举报
AndyWang 发表于 2014-7-19 23:47
嗯 谢谢 能具体说明下吗 比如 char name[2] = "it" ; 在这个字符串中  '\0' 是怎样存储的呢? ...

首先这个定义的字符数组就不会成立,你编译下
#include
int main()
{
        char name[2]="it"
        printf("%s",name);
}
它会给你报一个溢出的错误
回复 使用道具 举报
AndyWang 发表于 2014-7-19 23:47
嗯 谢谢 能具体说明下吗 比如 char name[2] = "it" ; 在这个字符串中  '\0' 是怎样存储的呢? ...

额,抱歉,我理解错你的意思了。。。如果是数组长度不足以容纳'\0',那'\0'就不会被存入数组。这样做风险很大。如果你严格按定义的数组长度2来使用数组,那还不会有什么问题,程序正常运行。但如果你之后忘了'\0'没有存入,想用'\0'判断字符串终结,或调用了依赖'\0'判断终结的函数,比如printf("%s"),那轻则打印出多余的字符,重则非法访问其他内存,程序崩溃。
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 00:23
额,抱歉,我理解错你的意思了。。。如果是数组长度不足以容纳'\0',那'\0'就不会被存入数组。这样做风险 ...

比如说
char name1[2] = "it";
char name2[5] = "it";
printf("%s\n",name1);
如果这样运行 应该会输出:itit
应该是这样吧?
回复 使用道具 举报
AndyWang 发表于 2014-7-20 00:51
比如说
char name1[2] = "it";
char name2[5] = "it";

这个,我只能说有的编译器是这样的。没查过C标准,不确定这样做是不是在所有编译器上都有保证。不过,字符数组给'\0'留足空间,会让你少很多莫名其妙的烦恼。
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 00:54
这个,我只能说有的编译器是这样的。没查过C标准,不确定这样做是不是在所有编译器上都有保证。不过,字 ...

ok 谢谢 你解答的好细心的呢 你是不是已经拿到入学名额了?
回复 使用道具 举报
AndyWang 发表于 2014-7-20 00:56
ok 谢谢 你解答的好细心的呢 你是不是已经拿到入学名额了?

不用客气。我还在观望,一是现在没法脱产学习4个月。二是还在犹豫学ios还是android。。。
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 01:02
不用客气。我还在观望,一是现在没法脱产学习4个月。二是还在犹豫学ios还是android。。。 ...

哦 那我觉得你现在技术已经很厉害了 到时候不管学哪一个应该都没问题吧  再次谢谢你细心地解答 早点休息吧 不早了  晚安
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马