本文是自己结合平时所学的知识,对sizeof和strlen的区别进行了总结,如有不对的地方还请批评指证,共同进步!!!
一、从C语言的定义上来讲
1、sizeof是关键字,而strlen是包含在string.h头文件中的一个计算字符串长度的函数
2.sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型,该类型保证能容纳实现所建立的最大对象的字节大小;
而string函数的返回类型是整形,返回的是字符串的起始到第一个‘NUL’的所占字节的个数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
4.大部分编译程序在编译的时候就把sizeof计算过了(所以sizeof的值是常量,不能出现在表达式的左边),其值是类型或是变量的长度,这就是sizeof(x)可以用来定义数组位数的原因①。
注①:因为数组在定义前必须是固定的,所以在C语言中用变量作为数组的大小是不行的
例:
int a=20;
char array[a];//编译器报错,这是错误的
char array[sizeof(a)];//这是可以的
二、从功能上来讲
1.strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
2.sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是函数。
3.当使用一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。
Sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。
4.sizeof操作符不能用于函数类型,不完全类型或位字段。
(不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型,未知内容的结构或联合类型,void类型等。)
三、从它们的实现上来讲(如有错误,请批评指正)
strlen是遇到0退出,注意:0和 '0' 不同(涉及NUL的解释,请看下面关于的NUL的解释)
而sizeof则是考虑数组的实际所占的存储空间,在程序编译期已被确定下来了
易错点及误区:
很多人都会有个潜意识:对同一数组操作,strlen的返回值肯定比sizeof的返回值小1,(很显然,这是错的,请看下面的例子)具体的解释看程序分析
附源码:
<span style="font-size:18px;">#include <stdio.h> #include <string.h> int main() { char a[]={'0','1','2',0,'3'}; printf("the size is :%d\n",sizeof(a)); printf("the size is :%d\n",strlen(a)); return 0; } </span>
程序的运行结果:
NUl的定义
C语言中规定以字符‘\0'作为字符串结束标志。’\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是“空操作字符”,
它不引起任何控制动作,也不是一个可显示的字符
对于程序的分析:
strlen是遇到0(及NUL)退出,上面的程序中strlen函数在遇到0时及数组中第四个元素时即退出了,故而返回的是值3
而sizeof则是考虑数组的实际所占的存储空间,在编译器编译期间已经定下来了,数组的实际的所占的存储的空间是5个字节,故而程序打印出5