Sizeof与Strlen的区别与联系 – carekee

一、sizeof
sizeof(…)是运算符,在头贴壁纸typedefunsigned int,该值是在波湾阴谋时计算的。,决定因素可以是装饰。、伸出、典型、情郎、效能,等。。
它的效能是:存在抵押权能调节眼球的晶状体发生所开发的最大情郎的音节大块。
因它是在波湾阴谋时波湾阴谋的。,这样sizeof不克不及用于恢复原来信仰的人静态分配的仓库量的大块。。确实,用sizeof恢复原来信仰的人典型和恒稳态分配的情郎、由创作或装饰接管的间隔,恢复原来信仰的人值和情郎、创作、装饰中仓库的实质经过缺乏相干。。
仔细关于,当决定因素列举如下,sizeof恢复原来信仰的人值的输入列举如下所示:
装饰——在波湾阴谋时分配的装饰间隔的大块。;
伸出——用来仓库伸出的间隔大块(地址的扣押为O),这是每一很长的整体。,得为4);
典型——这种典型占有的间隔的大块。;
情郎——尸体接管间隔的实践大块;
职务——职务恢复原来信仰的人典型的间隔大块。职务的恢复原来信仰的人典型不克不及为void
**************

二、strlen
strlen(…)是职务,可以在运转时计算。决定因素必然的是印伸出。char*)。当装饰名声作为决定因素使铭记时,确实,装饰向后的为伸出。。
它的效能是:恢复原来信仰的人印串的扣押。印串可以由本身限制。,它也可以随机地仓库在内存中。,职务的实践效能是穿越最重要的地址代表,直到偶然获得知识最后的事物者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恢复原来信仰的人限制arr部署兵力的时期,由波湾阴谋器分配的装饰间隔的大块。,客观仓库了几乎履历。。strlen只注意仓库的履历实质,不要在意间隔的大块和典型。。

    2char * 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
回顾:最重要的出口果实23确实,每个手术都可能性不大可能。,这静止parr外面存了什么(从帕尔[ 0 ]我开端理解第每一。NULL完毕);以第二位个果实确实是要计算的。parr感觉的静态仓库量的大块。,但适得其反,sizeof以为parr它是每一印伸出。,这样恢复原来信仰的人的是该伸出所占的间隔(伸出的仓库用的这是每一很长的整体。,因而4;第三果实,鉴于*parr它代表的是。parr仓库在地址间隔正中鹄的印崇高的,因而扣押是。1
************

四、参考资料:
SizeofStrlen差别与触点(转)

运算符的果实典型是。size_t,它在头贴壁纸typedefunsigned int典型。
该典型抵押权将最大情郎的音节大块保存为ES。。

是算符,strlen是职务。

可以运用典型作为决定因素。,strlen只运用char*做决定因素,它必然是””\0””最后的事物的。
sizeof还可以运用职务做决定因素。,譬如:
short f();
printf(“%d\n”, 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;

果实可以在运转时计算。,印串的扣押是计算摆脱的。,归咎于占有内存大块的典型。。

条件典型必然的添加间歇,条件变量名可以缺乏插曲。这是因sizeof它是每一手术符,归咎于职务。。

8.应用于创作典型或变量时, sizeof 恢复原来信仰的人实践大块,
应用于恒稳态间隔装饰时, sizeof 恢复原来信仰的人拿装饰的大块。。
sizeof 手术符不克不及恢复原来信仰的人静态地被分配了的装饰或在内地的装饰的量纲

9.装饰作为职务使铭记给职务,伸出替代装饰。,装饰的第每一地址被使铭记。,
如:
风趣的(char [8])
风趣的(char [])
二者都相当于 风趣的(char *)
C++在内地决定因素使铭记装饰始终感觉第每一元素O的伸出。,波湾阴谋器不意识装饰的大块。
条件您想意识职务中装饰的大块,它需求做。:
进入职务后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

发表评论

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