您的位置 首页 5G

sizeof与strlen的差异和联络

Sizeof与Strlen的区别与联系一、sizeofsizeof()是运算符,在头文件中typedef为unsignedint,其值在编译时即计算好了,参数可以是数组

Sizeof与Strlen的差异与联络

一、sizeof
sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即核算好了,参数可所以数组、指针、类型、目标、函数等。
它的功用是:取得确保能包容完结所树立的最大目标的字节巨细。
由于在编译时核算,因而sizeof不能用来回来动态分配的内存空间的巨细。实践上,用sizeof来回来类型以及静态分配的目标、结构或数组所占的空间,回来值跟目标、结构、数组所存储的内容没有关系。
具体而言,当参数别离如下时,sizeof回来的值表明的意义如下:
数组——编译时分配的数组空间巨细;
指针——存储该指针所用的空间巨细(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间巨细;
目标——目标的实践占用空间巨细;
函数——函数的回来类型所占的空间巨细。函数的回来类型不能是void。
**************

二、strlen
strlen(…)是函数,要在运转时才干核算。参数有必要是字符型指针(char*)。当数组名作为参数传入时,实践上数组就退化成指针了。
它的功用是:回来字符串的长度。该字符串或许是自己界说的,也或许是内存中随机的,该函数实践完结的功用是从代表该字符串的榜首个地址开端遍历,直到遇到完毕符NULL。回来的长度巨细不包括NULL。
*****************

三、举例:
eg1、char arr[10] = “What?”;
int len_one = strlen(arr);
int len_two = sizeof(arr);
cout << len_one << " and " << len_two << endl;
输出成果为:5 and 10
点评:sizeof回来界说arr数组时,编译器为其分配的数组空间巨细,不关怀里边存了多少数据。strlen只关怀存储的数据内容,不关怀空间的巨细和类型。

eg2、char * parr = new char[10];
int len_one = strlen(parr);
int len_two = sizeof(parr);
int len_three = sizeof(*parr);
cout << len_one << " and " << len_two << " and " << len_three << endl;
输出成果:23 and 4 and 1
点评:榜首个输出成果23实践上每次运转或许不相同,这取决于parr里边存了什么(从parr[0]开端知道遇到榜首个NULL完毕);第二个成果实践上原意是想核算parr所指向的动态内存空间的巨细,可是适得其反,sizeof认为parr是个字符指针,因而回来的是该指针所占的空间(指针的存储用的是长整型,所认为4);第三个成果,由于*parr所代表的是parr所指的地址空间寄存的字符,所以长度为1。
************

四、参考资料:
Sizeof与Strlen的差异与联络(转)

1.sizeof操作符的成果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型确保能包容完结所树立的最大目标的字节巨细。

2.sizeof是算符,strlen是函数。

3.sizeof能够用类型做参数,strlen只能用char*做参数,且有必要是以完毕的。
sizeof还能够用函数做参数,比方:
short f();
printf(“%d”, sizeof(f()));
输出的成果是sizeof(short),即2。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序 在编译的时分就把sizeof核算过了 是类型或是变量的长度这便是sizeof(x)能够用来界说数组维数的原因
char str[20]=”0123456789″;
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

6.strlen的成果要在运转的时分才干核算出来,时用来核算字符串的长度,不是类型占内存的巨细。

7.sizeof后假如是类型有必要加括弧,假如是变量名能够不加括弧。这是由于sizeof是个操作符不是个函数。

8.当适用了于一个结构类型时或变量, sizeof 回来实践的巨细,
当适用一静态地空间数组, sizeof 偿还悉数数组的尺度。
sizeof 操作符不能回来动态地被分派了的数组或外部的数组的尺度

9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的巨细
假如想在函数内知道数组的巨细, 需求这样做:
进入函数后用memcpy复制出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}

咱们能常在用到 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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/257037.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部