sizeof 和 strlen 的区别如下:
1. sizeof 操作符的结果类型是 size_t,它在头文件中的 typedef 为 unsigned int 类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2. sizeof 是运算符,strlen 是函数。
3. sizeof 可以用类型作参数,strlen 只能用 char* 作为参数,且必须是以 '\0' 结尾的。sizeof 还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是 sizeof(short),即2.
4. 大部分编译程序在编译的时候就把 sizeof 计算过了,是类型或是变量的长度。这就是 sizeof(x) 可以用来定义数组维数的原因。
5. strlen 的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
6. sizeof 后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof 是个操作符而不是个函数。
7. 当使用了一个结构类型或变量时,sizeof 返回实际的大小。当使用一静态的空间数组时,sizeof 返回全部数组的尺寸。sizeof 操作符不能返回被动态分配的数组或外部的数组的尺寸。
8. 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在 C++ 里传递数组永远都是传递指向数组首地址的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要将数组大小作为参数传入。
9. sizeof 操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
sizeof 的使用场合
1. sizeof 操作符的一个主要用途是与存储分配和 I/O 系统那样的例程进行通信。例如:
void *malloc(size_t size);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
2. 用它可以看看某种类型的对象在内存中所占的单元字节。例如:
void *memset(void *s, int c, sizeof(s));
3. 在动态分配一对象时,可以让系统知道要分配多少内存。
sizeof 不是函数,也不是一元运算符,它是个类似宏定义的特殊关键字,sizeof()。括号内的内容在编译过程中是不被编译的,而是被替代为类型,如 int = 8; sizeof(a);。在编译过程中,不管 a 的值是什么,只是被替换成类型 sizeof(int),结果为 4。如果 sizeof(a=6); 呢?也是一样地转换成 a 的类型。但是要注意,因为 a=6 是不被编译的,所以执行完sizeof(a=6); 后,a 的值还是8,是不变的。
结论:
1. unsigned 影响的只是最高位 bit 的意义(正/负),数据长度是不会被改变的。
2. 自定义类型的 sizeof 取值等同于它的类型原型。
3. 对函数使用 sizeof,在编译阶段会被函数返回值的类型取代。