sizeof和strlen的区别

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

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

好久没画思维导图了,最后以一个思维导图最为结尾

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值