Strlen()与sizeof()

     在学习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,而情况5str数组是局部变量,局部变量生成在栈区,初始值为随机值。

情况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

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

 

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

posted @ 2016-07-17 16:55  请叫我小小兽  阅读(433)  评论(0编辑  收藏  举报