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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星河鹭起 中级黑马   /  2014-4-11 23:56  /  1032 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看视频说,字符串以\0结尾,而且这个是算作一个字节。
如果我定义如下字符串:
char name[]={'2','4','\0','d','9'};
如果真的是以\0结尾的话,那就是说d 9 不会存储到内存中。事实是d 9还是存储在内存中了。
我的问题是:为什么运算出来的字节结果是5,如果我自己定义的\0算作一个字节的话,为什么这个字符数组结尾自带的\0没有进入内存呢??

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

倒序浏览
视频上mj老师说的是当你使用strlen()函数来计算字符串的长度的时候,如果遇到'\0', 函数会中止并返回已经计算的函数值,并不是说字符串中如果有‘\0’,后面的元素就不会被储存。
还有,你计算这个字符串的长度应该使用的是sizeof这个运算符,而不是strlen()函数。二者的区别简单说来就是strlen函数用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的大小;
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.     char name[]={'2','4','\0','d','9'};
  6.     int size1=strlen(name);
  7.     int size2=sizeof(name)/sizeof(char);
  8.     printf("%d\n%d\n",size1,size2 );//输出size1 为2, size2为5
  9.     return 0;
  10. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
墨迹的可乐 发表于 2014-4-12 04:04
视频上mj老师说的是当你使用strlen()函数来计算字符串的长度的时候,如果遇到'\0', 函数会中止并返回已经计 ...

对啊,我使用是的sizeof,不是使用strlen。MJ老师说\0是字符串的结束符,根据以下代码:
char name[]="asd\0dd";
char name2[]={'a','b'};
根据视频上说的,如果是这样,字符串则输出abasd,所以\0应该是字符串的结束符,为啥我说的那个不行呢?
回复 使用道具 举报
星河鹭起 发表于 2014-4-12 09:42
对啊,我使用是的sizeof,不是使用strlen。MJ老师说\0是字符串的结束符,根据以下代码:
char name[]="as ...

这么说吧  根据你的定义
char name2[]={'a','b'};  和char name2[]={'2','4','\0','d','9'}严格说来不是字符串,只算是字符型数组;因为结尾处没有'\0',每个字母会以数组元素的形式存储在内存中,但是当你以字符串的形式来调用和计算的时候,因为结尾没有'\0'的存在,因为会出现一些不可预计的错误;
char name[]="asd\0dd";则是将字符串直接赋值给字符数组,结尾处的'\0'也会自动添加到数组中,如果你使用sizeof计算一下也会发现结果是7,所以它既是字符串也是字符型数组。
每一个字符串都能转成字符型数组使用,但并不是每一个字符型数组都能当成字符串使用。
回复 使用道具 举报
墨迹的可乐 发表于 2014-4-12 18:04
这么说吧  根据你的定义
char name2[]={'a','b'};  和char name2[]={'2','4','\0','d','9'}严格说来不是 ...

原来如此,非常感谢,明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马