sizeof和strlen的区别

目录

一、 sizeof

二、 strlen 

三、 sizeof 和 strlen的对比


一、 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;
}

看结果:

 

我们可以看出这三个的值都是4,如果sizeof求变量的大小可以不加括号,如果是类型就必须加括号。

又比如:

#include <stdio.h>

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof("abcdef"));

	return 0;
}

看结果:

 

此时的结果是7,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,我们可以调试监视一下arr这个数组。

我们可以清楚的看见arr[6] = '\0',故sizeof(arr)= 7。 

二、 strlen 

strlen 是C语⾔库函数,功能是求字符串长度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在越界查找。 

看下面这段代码:

#include <stdio.h>
#include <string.h>

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 <stdio.h>
#include <string.h>

int main()
{

	printf("%d\n", strlen("abc\0def"));

	return 0;
}

 

这里的字符串“abc\0def"读取的结果是3想必不用赘述了吧!!!

我们在看一下上面sizeof的代码 

#include <stdio.h>
#include <string.h>
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的对比

sizeofstrlen

1. sizeof是操作符

2. sizeof计算操作数所占内存的大小, 单位是字节

3. 不关注内存中存放什么数据

1. strlen是库函数,使⽤需要包含头⽂件 string.h

2.srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界

  • 28
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Byte Master

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值