目录
一、 sizeof
二、 strlen
三、 sizeof 和 strlen的对比
在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的大小。
sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
比如:
#include
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
看结果:
我们可以看出这三个的值都是4,如果sizeof求变量的大小可以不加括号,如果是类型就必须加括号。
又比如:
#include
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof("abcdef"));
return 0;
}
看结果:
此时的结果是7,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,我们可以调试监视一下arr这个数组。
我们可以清楚的看见arr[6] = '\0',故sizeof(arr)= 7。
strlen 是C语⾔库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在越界查找。
看下面这段代码:
#include
#include
int main()
{
char arr1[] = { 'a','b','c','d','e','f' };
char arr2[] = { 'a','b','c','d','e','f','\0' };
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
return 0;
}
结果如下:
我们可以看到arr1数组的长度为38,arr2数组的长度为6,为什么呢?同样我们需要探讨两个数组在内存中的存储状况。
arr2数组的存储情况和示例1字符串的存储情况相同,而arr1却不同,所以arr2的长度为6我们就不再赘述,主要研究一下arr1的长度为什么是38。我们都知道字符串的结束标志为”\0",对于arr1数组来说,没有在数组中额外存储”\0",所以编译器在读取时,并不会像我们所期望的那样停止读取,故长度当然不会时6,至于为什么是38,是因为在读取时,编译器读取完arr1时会继续往后读取,直到读取到”\0",arr1在读取完第38个字符后才会遇到”\0";由于每个人的电脑和编译器不同,读取的长度也不一样,所以arr1这种情况一般我们认为它读取的结果为随机值!!!
为了说明”\0"的重要性,我们再举一个例子来说明。
#include
#include
int main()
{
printf("%d\n", strlen("abc\0def"));
return 0;
}
这里的字符串“abc\0def"读取的结果是3想必不用赘述了吧!!!
我们在看一下上面sizeof的代码
#include
#include
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof("abcdef"));
printf("%d\n", strlen("abcdef"));
return 0;
}
sizeof的结果是7,比strlen的结果多1,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,而strlen遇到”\0"就停止了。
sizeof | strlen |
1. sizeof是操作符 2. sizeof计算操作数所占内存的大小, 单位是字节 3. 不关注内存中存放什么数据 |
1. strlen是库函数,使⽤需要包含头⽂件 string.h 2.srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数 3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界 |