1. sizeof和strlen的对比
1.1 sizeof
我们在学习操作符的时候就学习到了sizeof,所以首先可以确定的是sizeof是操作符,而不是函数。
sizeof
计算的是变量所占内存内存空间的大小,单位是字节,如果操作数是类型,计算的是使用该类型创建的一个变量所占内存空间的大小。
sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据。
如:
#include <stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int)); //操作数为类型 计算使用该类型创建的一个变量所占空间的大小
return 0;
}
结果为:
1.2 strlen
strlen是C语言中的库函数
作用是求取字符串长度
函数原型为:
strlen所统计的就是参数str
的这个地址开始向后,\0
之前字符串中的字符个数。
这个str
是字符串的首个字符的地址。
如果没有给\0,就会一直往下找,直到找到为止
来看看下面的例子:
#include <stdio.h>
int main()
{
char arr1[3] = { 'a', 'b', 'c' };
char arr2[] = "abc";
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
return 0;
}
结果为:
可以看到printf("%d\n", strlen(arr1));
的结果居然是35,这是因为这个字符数组没有给\0
,所以就会在内存空间中一直往下找,找到\0
为止,换成你的编译器运行结果可能就不一样了。
而arr2的这个形式在末尾是默认有一个\0
的,所以我们能看到printf("%d\n", sizeof(arr2));
的打印结果为4,就是因为会多开一个空间来存放’\0’,这样就能很好地找到\0
,精准的算出字符串的长度。
如果我修改一下arr1数组的大小,在数组中手动添加一个\0
呢?
#include <stdio.h>
int main()
{
char arr1[4] = { 'a', 'b', 'c','\0'};
char arr2[] = "abc";
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
return 0;
}
运行结果为:
这就说明了strlen计算的字符串长度是在\0
之前的
1.3 两者对比
sizeof | strlen |
---|---|
sizeof是操作符 | strlen是头文件为string.h 的库函数 |
sizeof计算操作数所占内存空间的大小,单位是字节 | srtlen求字符串长度,统计的是 \0 之前的字符个数 |
不关注内存中存放什么数据 | 关注内存中是否有 \0 ,如果没有 \0 ,就会一直往后找,有越界的可能 |
本篇内容大概就是这样 明天会更新以strlen和sizeof为媒介来了解指针以及内存等的题目 不要错过啦!