关于sizeof和strlen的使用

关于sizeof和strlen经常容易搞混淆,特别是初学者。

 

先看一个关于sizeof的应用的实例:

    写出下面程序的答案:

        关于sizeof和strlen的使用_第1张图片

        关于sizeof和strlen的使用_第2张图片

 

        答案:4,11,100,400,4,3,4,6,8,4,4

        1、ss1是一个指针,指针的大小是一个定值,就是4.

        2、ss2是一个字符数组,这个数组的出事大小未定,有具体的值来定。再加上字符串的是以'\0'结束的,所以sizeof(ss2)的大小为11.

        3、ss3是一个给定确定大小的数组,因为是char型数组,所以其大小为100*1;

        4、ss4和ss3是一样的,只是ss4是int型数组,其大小为100*4;

        5、q1、q2和ss2是一样的,只是有一点要注意,'\n'是占一个字节的。

        6、q3和ss1是一样的,q1是指针,其大小固定的。

        7、A、B为结构体,在默认情况下,为了方便对结构体内元素的访问和管理,结构体的长度一定是最长的数据元素的整数倍。

        8、空结构体的大小为1,空类的大小也为1.

 

sizeof和strlen的两者的区别:

        1、sizeof操作符的类型是size_t,在头文件定义为unsigned int类型,

        2、sizeof是关键子,strlen是函数

        3、sizeof可以用作类型参数,strlen只能用char *做参数,且必须是以'\0'结尾的,sizeof还可以用函数做参数.

        short f()

        printf("%d\n",sizeof(f()));

        4、数组做sizeof的参数不退化,传递给strlen就退化为指针了。

        5、大部分程序在编译的时候就把sizeof计算过了,是类型或是变量的长度。

        6、strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占用的内存大小。

        7、sizeof后如果是类型必须加括号,如果是变量名可以不加括号,这是因为sizeof是操作符不是函数。

        8、当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一个静态空间数组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。

        9、数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在C++中,传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果要在函数内知道数组的大小,需要这样做,进入函数后,调用memcpy将数组拷贝进来,长度由另一个参数传进去。代码如下:

                fun (unsigned char *pl, int len)

                {

                        unsigned char *buf = new unsigned char[len+1];

                        memcpy(buf,pl,len);

                }

        10、sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型。

        

sizeof的使用场合:

        1、sizeof操作符的一个主要用途是与存储分配和IO系统那样的例程进行通信。

        2、用它可以看看某种类型的对象在内存中所占的单元字节。

        3、在动态分配内存时,可以让系统知道要分配多少内存。

        4、便于一些类型的扩充。

        5、由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof代替常量计算。

            6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出气指针的大小。

 

你可能感兴趣的:(关于sizeof和strlen的使用)