前言
sizeof和strlen函数基本在所有公司的嵌入式软件笔试题中都会出现。反正我是遇到了好几次。虽然很多人都会用,但是又很经常会出错,这是因为很多人没有好好的去总结。好了,废话不多说,进入今天的主题。
sizeof
sizeof()用来判断数据类型长度或数组长度。
数据类型
sizeof(char) //1
sizeof(short)//2
sizeof(int) //4
sizeof(long) //8
上面的参数直接给类型,返回的结果是操作系统对对应的类型分配的字节大小。简单说就是char类型的变量会分配1个字节,这些是根据具体的操作系统而言的,不同操作系统,不同编译器,分配的字节大小会有一点差异。
普通变量
char a;
sizeof(a); //1
int b;
sizeof(b); //4或2 跟具体编译器有关
上面使用普通变量和使用类型作为参数类似,都是根据变量的类型来判断具体的字节大小。
数值
sizeof(8); //4或2 ,在C语言数值8默认为int类型
sizeof(8.8);//8 , 8.8默认为double类型
基本上我们可以把上面三种情况当成同一类,其实都是根据类型来判断大小。
数组
//一维数组
int a[10];
sizeof(a); //40 总存储空间大小:4*10
sizeof(a[1]) //4
sizeof(&a) //4
sizeof(&a[0]) //4
//二维数组
int b[2][3]={
{1,2,3},
{4,5,6}
};
sizeof(b); //24 计算: 2*3*4 = 24
sizeof(b[0]) // 12 , 计算3*4 = 12
sizeof(b[0][1]) //4
sizeof(&b) //4
直接使用数组名就是计算整个数组占用的存储空间,然后我们具体说一下一维数组的后三个。第一个a[1]和普通变量时一样,所以也是根据类型来计算大小,所以int为4;第二个&a代表一个地址(它是数组名a的地址),而地址的大小都是4,无论什么类型变量的地址都是4(当然这个跟操作系统有关啦);第三个&a[0]也是地址,所以,你懂得!
字符串
char str[100] = "0123456789";
sizeof(str); //100 计算: 1*100
sizeof(str[0]) // 1
sizeof(&str) //4
char a[]="abc";
sizeof(a); //4 ,默认字符串会在末尾加上'\0'
char p[]="a\0";
sizeof(p) // 2
上面的字符串我只是指字符数组,字符串当然还可以是指针,因为我把指针独立出来,所以这里指字符数组。
首先,当我们指定了字符数组的大小时,则sizeof()的计算结果就是字符数组的大小。它的计算方式和其他类型的数组的方式一样。
然后就是不指定大小时,它是根据字符数量来自动分配数组大小的。要注意的是:当我们没有在字符串的末尾加'\0',会自动添加'\0'。所以上面的字符串长度才会是4.。
指针
int *p;
char * str;
sizeof(p); //4 ,这里就是返回指针的大小,因为指针存储的是地址
sizeof(str); //4
sizeof(*p); //4
sizeof(*str); //1
char* str1 = "12345";
sizeof(str1); //4
sizeof(*str1); //1, 第一个字符的大小
因为指针存放的是地址,所以无论是哪种类型的指针使用sizeof()返回都是4,地址的大小就是4 。当我们使用' * ' 运算符去获取指针的值时,然后使用sizeof()时就和sizeof(数值)是一样的了。
额,好像发现没办法获取字符串的长度了。
strlen
ok,上面我们不是发现指针没办法使用sizeof来获取字符串的长度吗?主角要上场了!
strlen: 计算给定字符串的长度,不包括'\0'在内。
原型:unsigned int strlen(char *s);
参数只能是char 类型,如果传int 会有问题。
char a[100] = "0123456789";
strlen(a); //结果是10
sizeof(ss); //结果是100
char *str1 = "11223344556677889900";
strlen(str1); //20
sizeof(str1); //4
strlen遇到'\0'就结束,并且不包括'\0'字符。