sizeof 与strlen的区别

来源:互联网 发布:股票质押式回购 知乎 编辑:程序博客网 时间:2024/06/10 21:25

复习到数据结构一章,现在贴出sizeof 与strlen的区别,大都是从网上百度而来,做了一下整理,写了几个测试代码。

sizeof:


sizeof(.....) 是一种运算符,不是函数,所以你不要想在头文件里找到的它。sizeof的结果类型为size_t,也就是unsigned int 型。unsigned  int 类型

在stdio.h头文件中被typedef为size_t,如图所示

sizeof的功能是获得保证能容纳实现所建立的最大对象的字节大小。说白了就是计算某种参数所占内存的大小。它不受存储内容的影响。其值是在编

译的时候计算好了的,是为什么 sizeof 可以用来定义数组大小的原因。这也是 sizeof 不能用来返回动态分配内存的大小的原因。

具体而言,当 sizeof 参数如下时,返回值表示含义如下:

1、数组 :

              当参数为数组时, sizeof 返回的是数组所占内存空几间的大小如:

              char str[20]={"123456789"};

              sizeof(str)  的结果为20, char 在32位机器上占一个字节,所以结果为 1 x 20;

              如果是 

              int dat[9] = {1,2,3,4,5,6,7,8,9};

              sizeof(dat)  的结果是36, int 在32位机器上占四个字节,所以结果为 4 x 9 ;

             有三点需加以说明,

            (1) 当数组作为传递参数时,不会退化为指针。这与 strlen 不同。

            (2) 它的返回结果与数组存储内容无关,只要你定义了一个数组,如上面的dat[9] 和 str[20],不管数组是空还是满,结果都是不变的。

            (3) 当传递的参数是静态的空间数组时,sizeof 将返回全部数组的尺寸。

2 、指针:

     当参数是指针时,sizeof 返回的是存储该指针所用空间的大小,也就是与指针的数据类型有关如:
     int *p;
     sizeof(p) 的结果为4,因为32位机器上的指针当然是32位,即4个字节,所以需要4个字节的内存空间保存,而sizeof就是求参数所占内存空间的大小。
     如果p是char型的,即:
     char *p;

     sizeof(p) 的结果是为1吗?当然不是,应该是4。刚才上面说的,在32位机器上,指针是4个字节的,所以保存指针的内存空间是4个字节。定义指针时前面的类          型名只是说明该指针指向的是该类型的变量,就像int *p ,只是说明p指向的是整型变量的地址,而char *p 说明它指向的是字符变量的地址。所以注意当     

     sizeof的参数为指针时,它的结果只与机器有关,而与指针的指向无关,不管是char    int   struct还是 union类型,也不管是否给它赋值 。再看下面这个例子:

     int *p[10];  

     sizeof(p)的结果为 40,即 4 x 10,原理还是一样。

3、函数:

             当参数为函数时,返回的结果是函数返回值所占内存空间的大小,当然不能是无返回值的函数,即void 类型函数,例如。

             int a ,b;

             int    fun1();

             char fun2();

              a = sizeof(fun1());

              b = sizeof(fun2());

              则在32位机器上,a的值是4,b的值是1。

4、类型:

             sizeof的参数可以是构造类型,如结构体,联合体。下面各举一例。

             struct  STU

                              {

                               int a;

                               int b;

                               char c;

                               }student;

           则在32位机器上,sizeof(student) 的结果为12。这个结果可能出乎大家意料,这涉及到内存空洞的问题,这里不多讨论


          

              union STU

                              {

                               int a;

                               int b;

                               char c;

                               }student;

           则在32位机器上,sizeof(student) 的结果为4。

5、对象:

             当参数为对象时,返回的是该对象所占内存空间的大小。由于对对象我还没学习到,这里就不多说。


还有最后一点,如果后面的参数是类型时如 int  char 或定义的结构体类型时,sizeof 后面的括号不能省,当是变量时,则可省略。因为 sizeof 是运算符,而并非函数。


strlen :

    

strlen是一个函数,在 string.h 头文件里有定义。由于strlen()是一个函数,所以它要在程序运行时才能计算,它的参数只能是字符型指针(char *str),即只能对字符串进行操作。它是用来计算一个以 '\0' 结束的字符串的长度,即字符的个数,但不包括'\0'。strlen返回的结果受字符串数组内容的影响。下面举几个例子:

eg 1:

        char  str[11] = {"1234567890"};

        则strlen(str) 的结果是 10,因为str里面有10个字符。注意,在定义字符串数组时,字符串大小要比你所放字符个数多一个,因为编译器会自动在后面加一个'\0'结束标         。因此你指定的字符串数组大小必须要比字符个数多一个。要么就不指定大小,如  char  str[] = {"1234567890"};  这只适合在赋初值的情况。

eg 2:

       char  str[12] ={'12345\067890'};

       则strlen(str) 的结果是5,因为遇到'\0'时就结束。如果是  char  str[12] ={'\01234567890'};  结果就是0。

当数组名作为参数传递给strlen时,数组就会退化成指针,指向字符串的首址。





1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 站久了脚趾痛怎么办 心脏被踢了一脚怎么办 从马背上摔下来怎么办 小孩蛋蛋碰撞后有积液怎么办 小孩蛋蛋大小不一样有积液怎么办 对派出所的笔录不服怎么办 蛋蛋让尿淹了发红有小红瘩达怎么办 手被皮筋弹肿了怎么办 手被皮筋勒肿了怎么办 皮筋把手挤肿了怎么办 猫被皮筋绑久肿了怎么办 抗链0高关节疼怎么办 近视800度老了怎么办 军检体重不达标怎么办 到交房租没有钱怎么办 房租没到期房东要收回怎么办 客户指定发快递我要怎么办? 跨境汇款被退回怎么办 汇款途径写错了怎么办 快递被菜鸟驿站退回怎么办 电脑登录账户已锁定怎么办 被外管局查到境外汇款买房怎么办 军校生复检被刷怎么办 企业私刻章拿去挂项目怎么办? 中通快递被退回怎么办 网易邮箱提示被修复怎么办 小孩屁股烫红了怎么办 8岁近视400度怎么办 部队体能差的人怎么办 上环5天同房了怎么办 肾结石有3mm了怎么办 4*3mm肾结石好痛怎么办 做完肾结石积水后迟续发烧怎么办 血糖高有肾结石反复发高烧怎么办 肾里面有小结石怎么办 大于2厘米的结石怎么办 双肾结石肾盏扩张怎么办 边防消防警卫部队改革义务兵怎么办 汽车年检尾气复检不合格怎么办 车辆年检尾气不合格复检怎么办? 在瓜子上买车复检有问题怎么办