C语言中strlen和sizeof的区别

描述

如果你经常刷笔试题,那你一定会刷到这样的题目:
 

char str[] = “hello”;
printf(“%d %d
”, sizeof(str), strlen(str));


const char *str = “hello”;
printf(“%d %d
”, sizeof(str), strlen(str));
 

把 sizeof 和 strlen 放在一起考察,题目不难,只要你的C语言基本功扎实,做出来应该没问题。

第一个,str是个数组,数组里面的内容是字符串hello。但是需要注意的是,字符串都是以'�'结尾,所以数组实际占6个字节。

sizeof是关键字,用于求解类型的长度,sizeof加上数组名,表示数组所占的字节数,所以结果是6。

strlen是字符串处理函数,求解字符串的长度,长度不包含'�',所以结果是5。

第二个,str是指针,指向字符串常量。

sizeof加上指针,表示指针变量占的字节数,32位系统是4字节,64位系统是8字节。至于说字符串长度,跟上面一样,是5个字节。

这些都算是常见的,我们再来看下不常见的,指针都当作8字节来处理。
int a[] = {1, 2, 3}; 


printf("%ld
", sizeof(&a));
printf("%ld
", sizeof(*a));


int b[2][3] = {0};
printf("%ld
", sizeof(b[0]));
printf("%ld
", sizeof(b[0] + 1));
printf("%ld
", sizeof(&b[0]));
 

一个一维数组,&a表示数组的地址,sizeof(&a)是8字节。

*a表示数组第一个元素,sizeof(*a)是4个字节。

对于二维数组,b[0]表示首行首元素地址,类似于一维数组的数组名,sizeof(b[0])就是第一行的长度12字节。

b[0]+1表示首行第二个元素的地址,编译器当作指针来处理,sizeof(b[0] + 1)是8个字节。

&b[0]表示数组首行地址,编译器同样把它当作指针来处理,sizeof(&b[0])也是8字节。  

 

审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分