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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 godlike 于 2014-5-14 14:07 编辑

今天百度看到一道c语言的面试题,sizeof与strlen的区别;自己试了一下,发现了什么好像,请多多指教啊。
大家都知道,sizeof:计算某个变量或者某种数据类型在内存中所占的字节; strlen 计算字符串的长度
对于同一个字符串:sizeof会把'\0'也算进去,strlen则是除去'\0'的字符串长度;
  1. int main()
  2. {
  3.    char name[] = "abc哈";
  4.     printf("sizeof(name)=%lu\n", sizeof(name));//结果为7,说明了一个汉字占3个字节
  5.     printf("strlen(name)=%lu\n", strlen(name));//除去'\0',结果自然是6
  6. }
复制代码

请看另外的情况:这样定义字符串:char *name = "哈";
  1. int main()
  2. {
  3.     char *name = "哈";
  4.     printf("sizeof(name1)=%lu\n", sizeof(name1));//结果为8,并且无论name1怎么变,这个值都不会变
  5.     printf("strlen(name1)=%lu\n", strlen(name1));//结果正常
  6. }
复制代码

这是不是也算区别,用指针的形式定义字符串,sizeof()的值固定是8,也就是指针的大小,这么理解我忍了,但是数组名也是地址啊,为什么就不是输出它的地址的所占的字节数;
还没完:sizeof可以这样输出:  sizeof(*name),且结果又不变,一直是1
  1. int main()
  2. {
  3.   char *name1 = "哈哈哈";
  4.     printf("sizeof(name)=%lu\n", sizeof(*name1));//结果是1了
  5.     printf("strlen(name)=%lu\n", strlen(name1));//结果正常:9
  6. }
复制代码

好吧,这下我彻底晕了:dizzy:

评分

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

查看全部评分

2 个回复

正序浏览
    二楼表示看不懂。表示看不懂你看不懂哪一块,我就当你不懂最后一个吧。
   
    char *name1 表示是一个指向字符串的指针,因为它是字符类型的,所以(*name1)取的时第一个字符的大小,char *name1之所以能指向一个字符串,它只是指向了字符串的首字符的地址。所以你的(*name1)就是1字节了。

strlen(name1)它的功能是计算以该name1地址开始的字符,直到遇到'\0',然后计算所有的字符长度,所以当然是9了。
懂了吗?小伙伴,要是还不懂,可以@我哦!:#

评分

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

查看全部评分

回复 使用道具 举报
二楼怎么看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马