《1》sizeof与strlen的区别
1.sizeof 操作符的结果类型是size_t(头文件中定义为unsigned int)。
2.sizeof 是运算符,strlen是函数。
3.sizeof 可以用类型做参数,也可以用函数做参数;strlen 只能用char * 做参数,且必须以 “\0” 结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针。
5.大部分编译程序在编译的时候就把sizeof 计算过了,是类型或是变量的长度,这就是sizeof(x) 可以用来定义数组维数的原因:
char str[20]="0123456789";
int a=strlen(str);//a=10;
int b=sizeof(str);//b=20;
6.strlen 的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
7.sizeof 后如果是类型必须加括号,如果是变量名可以不加括号。因为sizeof 是操作符而不是函数。
8.当使用了一个结构类型或变量时,sizeof 返回实际的大小。当使用一静态的空间数组时,sizeof返回 全部数组的尺寸;sizeof 操作符不能返回被动态分配的数组或外部的数组的尺寸。
9.数组作为参数传递给函数时传的是指针而不是数组,传递的是数组的首地址;fun(char [8])、fun(char [])都等价于 fun(char *)。在c++中传递数组永远是传递指向数组首元素的指针、编译器不知道数组的大小。
10.sizeof 操作符不能用于函数类型、不完全类型或位字段。不完全类型是指具有未知存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
《2》 sizeof 的适用场合
1.sizeof操作符的一个主要用途是与存储分配和I/o系统那样的例程进行通信:
void *malloc(size_t size);
size_t freed(void *ptr, size_t size,size_t nmemb,FILE *stream);
2.可以查看某种类型对象在内存中所占的单元字节:
void *memset(void *s,int c,sizeof(s));
3.在动态分配一对象时,可以让系统知道要分配多少内存。
4.便于一些类型的扩充。在windwos中有很多结构类型就有一个专用字段用来存放该类型字节大小。
5.由于操作数的字节数在实现时可能出现变化,建议在设计操作数字节大小时用sizeof代替常量计算。
6.如果操作数是函数中的数组形参或函数类型的形参,sizeof 给出其指针的大小。