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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 77媛儿 中级黑马   /  2014-3-14 10:15  /  1977 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

char arr[10] = "What?";
              int len_one = strlen(arr);
              int len_two = sizeof(arr);
    输出结果为:5 and 10
    点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
sizeof()返回的是分配数组空间大小,数组空间大小不是由里边的元素决定的吗

评分

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

查看全部评分

10 个回复

倒序浏览
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。因为你的arr[10] 字符数组中只有5个字符,第六个字符就是'\n',所有strlen返回的是5;
sizeof简单的说其作用就是返回一个对象或者类型所占的内存字节数,所以你说的对sizeof()返回的是分配数组空间大小,因为你定义的时候已经申请了10个字节的内存空间,所以返回的是10.
数组空间大小不是由里边的元素决定的吗?这个问题可以肯定的回答你:数组空间大小绝对不是里面的元素所决定的。而是你初始化申请内存的时候决定的。

评分

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

查看全部评分

回复 使用道具 举报
脸皮猴 发表于 2014-3-14 10:27
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不 ...

猴哥犀利,感谢我的打大猴哥,不过第六个字符是\0吧
回复 使用道具 举报
77媛儿 发表于 2014-3-14 11:35
猴哥犀利,感谢我的打大猴哥,不过第六个字符是\0吧

额····打错了···应该是'\0'。。。。。
回复 使用道具 举报
sizeof(...)是运算符:获得保证能容纳实现所建立的最大对象的字节大小。
strlen(...)是函数:返回字符串的长度。
回复 使用道具 举报
刘元明 来自手机 中级黑马 2014-3-14 14:07:35
地板
sizeof计算在内存中所占字节,strlen是字符串的方法,用于计算字符串常量的长度,不包括末尾的\0。两者做的事明显不一样
回复 使用道具 举报
刘元明 来自手机 中级黑马 2014-3-14 14:11:09
7#
至于输出结果的分析,脸皮猴说的很对!
回复 使用道具 举报

sizeof(arr),  是看arr开辟了多少个合法空间,这里你定义是是   char  arr[10], 所以是10个char 空间,至于这十个空间用没用,sizeof(arr) 都会返回10字节

strlen(arr), 这是用来计算字符串,有效位字符的个数的,如果你定义这个空间,但没有初始化,那么,这个函数可能会出错,字符串是以' \0' 结尾,定义时
                  char arr[10] = "What?"; 所以你初始化了,但这里给你自动在 ?后面加了一个'\0', 这个不算有效字符,所以回返

数组空间大小不是由里边的元素决定的吗

如果你是这么定义的    char arr[] = "What?" ;   //那么个字符串的空间,就是由里面的元素决定的,不过这里是 6个char 空间 sizeof(arr) 返回 6
但如果是这样              char arr[] = {'W', 'h', 'a', 't', '?'};    //那么sizeof(arr) 返回是5,且用strlen(arr);这个函数会出现未知的结果。

不知道你清楚了没

评分

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

查看全部评分

回复 使用道具 举报
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。  

上面是对静态数组处理的结果,如果是对指针,结果就不一样了

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是

长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
回复 使用道具 举报
sizeof是一个运算符。在编译的时候就确定了。
strlen是一个函数。计算字符串的长度。碰到'\0'时就结束。计算的大小不包括'\0'
回复 使用道具 举报
sizeof(...)是运算符,它是获得保证能容纳实现所建立的最大对象的字节大小。
strlen(...)是函数,要在运行时才能计算,返回字符串的长度。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马