1.sizeof求的是数据类型所占空间的大小(不受其中存储内容的影响),而strlen是求字符串的长度。
2.sizeof的参数可以是变量也可以是数据类型,strlen的参数只能是以"\0"结尾的字符串。
3.编译器在编译的时候就计算出了sizeof的大小,而strlen只有在程序运行期间才能计算出字符串长度。
4.在子函数中,ziseof 会把从主函数中传进来的字符数组当作是指针来处理。
例如:
#include<stdio.h>
#include<string.h>
void main()
{
char str[]="hello";
char str2[20]="hello";
char *str3="hello";
char str4[]={'h','e','l','l','o','\0'};
char str5[]={'h','e','l','l','o'};
printf("sizeof:%d strlen:%d\n",sizeof(str),strlen(str)); //6 5
printf("sizeof:%d strlen:%d\n",sizeof(str2),strlen(str2)); //20 5
printf("sizeof:%d strlen:%d\n",sizeof(str3),strlen(str3)); //4 5
printf("sizeof:%d strlen:%d\n",sizeof(str4),strlen(str4)); //6 5
printf("sizeof:%d strlen:%d\n",sizeof(str5),strlen(str5)); //5 不确定的数
}
说明:
str[]="hello":
因为strlen测量的是字符串的长度,以遇到的第一个'\0'为结束标志,所以strlen(str)=5;而对sizeof来说,‘\0’也占用一个字节,所以sizeof(str)=6。
char str2[20]="hello":
因为strlen测量的是字符串的长度,以遇到的第一个'\0'为结束标志,所以strlen(str2)=5;sizeof计算的是分配的数组str2[20]所占空间的大小,不受存储内容的影响,sizeof(str2)=20。
char *str3="hello":
sizeof(str3)返回指针大小,在32位系统下指针大小为4字节,因此sizeof(str3)=4。
char str4[]={'h','e','l','l','o','\0'}
和char str5[]={'h','e','l','l','o'}:
我们知道字符串是以 '\0' 为结束标志的,所以char str[ ] = "hello" 等效于char str4[ ] = {'h' , 'e' , 'l' , 'l' , 'o' , '\0'} 。strlen函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而如果不在字符数组初始化的时候加上'\0',那么strlen得到的值就不是正确的数值,打印出来的结果也不是想要的结果。因此我们要避免这种情况,在初始化的时候要记得加上'\0',或者一次性赋初值。
现在注意这一句:在子函数中,ziseof 会把从主函数中传进来的字符数组当作是指针来处理。
而指针的大小又是取决于机器,而非人为决定的。看下面这个例子:
#include<stdio.h>
#include<string.h>
void size_of(char str[])
{
printf("sizeof:%d\n", sizeof(str));
}
void main()
{
char str[20] = "hello";
size_of(str);
}
这个例子输出结果为:sizeof:4