1、sizeof
sizeof计算变量所占内存内存空间大小,单位是字节。如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据。
光看文字的话可能不好理解,下面我们看代码举例。
int main()
{
int a = 0;
printf("%zd\n", sizeof(a));//结果为4
printf("%zd\n", sizeof(int));//结果为4
}
上面两行代码的打印结果都为4。
因此说明a在内存中占用四个字节。a是int类型变量,所以这里可以看成计算的是int类型在内存中占用空间的大小,因此上面两行代码的打印结果都为4。
注意:sizeof的返回值类型是size_t。
下面我们可以看一段有趣的代码
大家可以停在这里思考一会。
int main()
{
short s = 10;
int i = 2;
int n = sizeof(s = i + 4);
printf("%d\n", n);
printf("%d\n", s);
return 0;
}
答案是 2 10
解答:s为short类型,占用2个字节。
i是int类型, 占用4个字节。
代码中,i+4的值想要赋给s,但是i+4为int类型,s为short类型,显然i+4占用内存比s要大,所以s装不下i,这里发生截断,s还是short类型,因此sizeof(s=i+4)结果为2。第二个就很好理解了,我们将表达式放入sizeof中计算,此时s=i+4是不参与实际运算的,因此s还是10,结果显而易见也为10.
2、strlen
strlen是C语言的一个库函数,功能是求字符串长度。
函数原型如下:
size_t strlen (const char *str);
统计的是从strlen函数参数str中这个地址开始向后,\0之前字符串的个数。
strlen函数会一直向后找\0字符,直到找到为止,所以可能存在越界查找。
下面我们看代码举例:
int main()
{
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//打印结果为6
}
![](https://i-blog.csdnimg.cn/blog_migrate/4d71011dc16ea4e3755b35174fdb344b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9b0b0044940416200b98563058f5674b.png)
我们可以看到字符串abcdef\0在内存中是连续的地址61 62 63 64 65 66 00,strlen在运算时遇到00结束,所以结果为6.
3、sizeof和strlen的对比
sizeof
1. sizeof是操作符
2. sizeof计算操作数所占内 存的⼤⼩,单位是字节
3. 不关注内存中存放什么数据。
strlen
1. strlen是库函数,使⽤需要包含头⽂件 string.h
2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界。