有任何不懂的问题可以评论区留言,能力范围内都会一一回答
sizeof和strlen我们经常被用作去求字符串的大小,那么这两个有什么区别呢?
sizeof | strlen |
1.sizeof是操作符 2.sizeof计算操作数所占内存的大小,单位是字节 3.不关注内存中存放什么数据 4.sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。 5.该操作符的返回值是size_t,是无符号的 | 1.strlen是库函数 2.strlen是求字符串长度的,统计的是\0之前的字符个数 3.关注内存中是否有\0,如果没有\0,就会持续往后找,可能会越界 4.该函数的返回值是size_t,是无符号的 5.strlen函数需要有头文件#include<string.h> |
sizeof 运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是unsigned int,也有可能是 unsigned long,甚至是 unsigned long long,对应的 printf()占位符分别是 %u 、 %lu 和 %llu。
这样不利于程序的可移植性。C语言提供了一个解决方法,创造了一个类型别名size_t,用来统一表示sizeof的返回值类型。对应当前系统的sizeof 的返回值类型,可能是unsigned int,也可能是unsigned long long。
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。 sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
sizeof 的计算结果是 size _ t 类型的。
区别如上
这样说起来好像很无趣,我们直接来上一道题
不看后面答案,先思考一下,这串代码运行的结果是多少
#define _CRT_SECURE_NO_WARNING
#include <stdio.h>
int main(void) {
char arr1[] = { 'a','b','c' };
char arr2[] = { "abc" };
printf("sizeof(arr1)是%d\nstrlen(arr1)是%d\n", sizeof(arr1),strlen(arr1));
printf("sizeof(arr2)是%d\nstrlen(arr2)是%d\n", sizeof(arr2), strlen(arr2));
return 0;
}
我们依次来看
{'a','b','c'}和{“abc”} 的区别在哪?
arr1:{'a','b','c'}是三个字符没有\0结尾,strlen函数是检测到\0才会停止,{'a','b','c'}中没有\0因此strlen会沿着arr1往后访问直到遇到\0才会停止,strlen(arr1)会越界访问,结果是未知的
但是sizeof才不会关心有没有\0呢,它只会关心这个数组所占内存大小是多少(单位:字节),arr1中刚好就存放了三个字符,所以大小是3
arr2:{“abc”}是一个字符串,字符串在末尾会默认加\0,也就是arr2中存放着abc\0这四个字符,因此arr2这个数组所占的内存大小是4,所以sizeof(arr2)的结果是4
但是strlen遇到\0就停止了,并且统计\0前的空间大小,也就是三个字符abc的空间大小,所以strlen(arr2)的结果是3
好久没画思维导图了,最后以一个思维导图最为结尾