sizeof和strlen的区别

目录

一、 sizeof

二、 strlen 

三、 sizeof 和 strlen的对比


一、 sizeof

在学习操作符的时候,我们学习了 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;
}

看结果:

sizeof和strlen的区别_第1张图片 

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

sizeof和strlen的区别_第2张图片

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

二、 strlen 

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

结果如下:

sizeof和strlen的区别_第3张图片 

我们可以看到arr1数组的长度为38,arr2数组的长度为6,为什么呢?同样我们需要探讨两个数组在内存中的存储状况。

sizeof和strlen的区别_第4张图片

 

 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和strlen的区别_第5张图片 

sizeof的结果是7,比strlen的结果多1,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,而strlen遇到”\0"就停止了。

三、 sizeof 和 strlen的对比

sizeof strlen

1. sizeof是操作符

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

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

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

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

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

你可能感兴趣的:(算法)