关于sizeof和strlen经常容易搞混淆,特别是初学者。
先看一个关于sizeof的应用的实例:
写出下面程序的答案:
答案: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给出气指针的大小。