sizeof与strlen的区别

char STR = 20 =0123456789
int   a=strlen(str); /*a=10;strlen 计算字母行的尺寸,与0'as字母行完毕标志。
int   b=sizeof(str); /*b=20;sizeof 计算块的框架[ 20 ]比率 占据期间贮存器空白表格的尺寸,不受本质上的情节的持有物
============================================================================================

char *str1=”absde”;
char str2[]=”absde”;
char STR3 [ 8 ] = {'a',};
char ss[] = “0123456789”;

出口:

sizeof(str1)=4
sizeof(str2)=6;
sizeof(str3)=8;
sizeof(SS)= 11

率先阐明在某种程度上,char典型只占每一音节。,这么样sizeof(char)是1,要忧虑这一

str1是柄,刚才定向字母行absde。这么样sizeof(str1)批评每一字母行或角色块空白表格空白表格,它是角色柄的空格。。因而sizeof(str1)=sizeof(char*)=4,在C和C 中,每一柄占4音节

是每一角色块分给。信用证条目,助动词=have每一块,回转该块占据期间的总空白表格。,这么样sizeof(str2)是字母行absde为总空白表格。”absde”中,罕见的一种 b s d e 0六角色,这么样的分给块的尺寸是6,因而sizeof(str2)=6*sizeof(char)=6

但已被界限为8的块,这么样sizeof(STR3)是8

str4和str2是外表的,”0” ”1” … 9'plus ' 0 '共11字,因而SS的空白表格是8。

总就之,为柄,sizeof操纵符回转的柄所占据期间的空白表格,是4音节;助动词=have块,sizeof回转因此块的持有元素所占的总空白表格。char简单明了与char使更难于理解。,我们家不得不分别,现时还不鼓舞写charAAA。,应克制不要
而strlen不分别是块否则柄,回转尺寸达0。并且strlen是不把\0算进字母行的尺寸的。
============================================================================================
一、sizeof
Sizeof(…)是运营商,在头档案中,界限为无记号 int,它的值是在波湾阴谋时计算的。,参量可以是块。、柄、典型、宾语、效能等。。
它的效能是:获取包管最大宾语发觉的音节的尺寸。。
鉴于波湾阴谋时波湾阴谋,这么样sizeof不克不及回转静态分派尺寸的备忘账。说起来的,回转典型和静力学分派的宾语的尺寸、经过每一框架或块占据期间的空白表格。,回转值和宾语、框架、块中贮存器的情节不相关。。
详细情节就,当参量如次,意思的价钱为经过sizeof回转如次:
块——波湾阴谋时分派的块空白表格的尺寸。;
柄—用来贮存器柄的空白表格尺寸(尺寸),是每一长整数,应该是4);
占据期间典型空白表格的尺寸。;
宾语——宾语的现实占据期间空白表格的尺寸。;
应变量——应变量回转典型的空白表格。应变量的回转典型不克不及是空的。。
**************

二、strlen
strlen(…)是应变量,可以在运转时计算。参量不得不是角色典型柄(char)。。当块名字作为参量转交时,说起来,块退化为柄。。
它的效能是:回转字母行的尺寸。因此字母行可以由它自己界限。,它也能够是随机的。,因此应变量现实结局的效能是开端遍历FR。,直到堵塞null完毕。回转的尺寸除非null。。
*****************

三、插图画家:
译、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回转界限块块,波湾阴谋器分派给它的块空白表格的尺寸。,冷漠贮存器了好多标明。。strlen只愿意贮存器的标明情节,不要在意空白表格的尺寸和典型。。

    2、char * parr = new 角色[ 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
检验:5月23日的一号出口最后在每回运转中说起来的不一样。,这剩余部分parr外面存了什么(从parr[0]开端确信偶遇第每一NULL完毕);次要的最后说起来的断定静态贮存器空白表格的尺寸来计算的,但这违反了民众的想要。,Sizeof以为Parr是每一角色柄,这么样回转的是该柄所占的空白表格(柄的贮存器用的是每一长整数,因而4);第三个最后,由于帕尔表现贮存器在地址空白表格的特点称,这么样的尺寸是1。
************

四、参考资料:
Sizeof和Strlen中间的差(转)

该操纵符的最后典型是size_t,它在头档案中,界限为无记号 int典型。
这类包管的最大宾语发觉的音节尺寸。

是经营者,strlen是应变量。

你可以做每一典型参量,strlen只能用char*做参量,并且不得不在0的结局。
sizeof也可以作为每一效能停止参量,比方:
short f();
printf(“%d\n”, sizeof(f()));
出口的最后是sizeof(短),即2。

4个参量。块不退化为sizeof,转交给strlen就退化为柄了。

5。大多波湾阴谋程序 sizeof在波湾阴谋时计算 是典型左右变量的尺寸这执意sizeof(x)可以用来界限块维数的原文
char STR = 20 =0123456789
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

最后可以在运转时计算。,时期是用来计算字母行尺寸的。,缺少典型的内存尺寸。

即使典型不得不添加间歇,即使变量名可以缺少类别层次。这是由于sizeof是每一运算符,是批评每一应变量。

8。运用于框架典型或变量时, sizeof 回转现实尺寸,
当每一静力学空白表格衣服的运用, sizeof 块持有尺寸的回转。
sizeof 运算符不克不及回转在调整的块或块的尺寸。

9。块作为柄转交给应变量,而批评柄。,块的第每一地址被转交。,
如:
风趣的(char [8])
风趣的(char [])
都均等于 风趣的(char *)
在C 中,参量转交块老是定向第每一元素的柄,波湾阴谋器不确信块的尺寸
即使您想确信应变量中块的尺寸, 它必要这么样做:
进入该效能后,将它再版与拷贝,尺寸是由可供选择的事物塑造的参量传入的。
fun(unsiged char *p1, int Len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, Len);
}

我们家可以常常运用 sizeof 和 strlen 的时辰,Usually the length of the calculation string array
请看下面的详细情节解说。,这两种用法的运用有分别。,从因此举例中可以透明的地理解:

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是第每一角色。 In fact, it's the first bit of'0'to get the string 占据期间的贮存器空白表格,是char类吗?

型的,占了 1 位

strlen(ss)= 10 >>>> 即使你想受理因此字母行的尺寸,它不得不运用 strlen
===========================================================================

发表评论

电子邮件地址不会被公开。 必填项已用*标注