Strlen()与sizeof()

时间:2022-05-09 19:07:21

在学习C语言时以及面试中,经常会见到strlen()与sizeof()这一对容易混淆的概念,搞清楚这两个概念,往往考察了编程人员对语言的基本掌握能力。

首先大家先明确两个概念是:

1.strlen()是函数,而sizeof()是表面看起来像函数的关键字。

2.Strlen()求得是长度,针对的对象是字符串,而sizeof()求的是大小针对的是类型

之所以二者经常混淆,那是由于在使用过程中未能正确区分哪个是求长度,哪个是求大小,下面就具体讲解sizeof()与strlen()在各种情况下的长度与大小。

情况1:

void main()

{

char str[]=”hello C”;

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果:strlen()=7

sizeof()=8

由于在用字符初始化数组时,系统会在字符串末尾自动加上一个’\0’作为字符的结束标记,因此用sizeof()求出的长度就比strlen()有效长度大1。

情况2:

void main()

{

char str[10]=”hello C”;

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

执行结果:strlen()=7

sizeof()=10

数组名str代表了整个空间的大小,因此sizeof()为10。

情况3:

void main()

{

char str[]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’C’};

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果:strlen()=11

sizeof()=7

由于在初始化str时没有\0,所以strlen()为随机值,而大小就为字符初始化后所占空间的个数。

情况4:

void main()

{

char str[10]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’C’};

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果:strlen()=7

sizeof()=10

由于str未完全初始化,数组剩下的位置用0来填充(‘\0’就是字符0的转意,即0),所以不难看理解str后面的0相当于’\0’,所以strlen(str)的长度为7,而sizeof(str)为数组空间的大小。

情况5与情况6:

void main()

{

char str[10];

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果:strlen()=15

sizeof()=10

sizeof()为数组的大小为10,这毫无疑问,但此时strlen()为随机值。

char str[10];

void main()

{

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果:strlen()=0

sizeof()=10

当把数组变为全局的时,strlen()则变为0,原因是全局变量生成在静态常量区,初始值为0,而情况5中str数组是局部变量,局部变量生成在栈区,初始值为随机值。

情况7:

void main()

{

char *str=”hello C”;

printf(“strlen()=%d\n”,strlen(str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果:strlen()=7

sizeof()=4

由于sizeof()求的是类型的大小而str的类型是指针,因此在32位系统下sizeof()=4;同样的无论是数组指针,函数指针,只要是指针它的sizeof()都等于4。

情况8:

void main()

{

char *str[3]={”hello C”,”abcd”,”xyz”};

//printf(“strlen()=%d\n”,strlen(*str));

printf(“sizeof()=%d\n”,sizeof(str));

}

运行结果: sizeof()=12  strlen(*str)=7//无法求str的有效长度,但是可以求*str的有效长度,即首元素的有效长度

str为指针数组,里面包含了三个指针,所以32它的大小为三个指针类型的大小,即它的sizeof()在32位系统下为3*4=12;

情况9:

当函数用数组做参数时,数组会退化为指针。

以上的九种情况是笔试题中常考的几种类型,相信只要掌握好了,以后遇上这类型题也就迎刃而解了。