sizeof()和strlen() 傻傻分不清?

sizeof 和 strlen,傻傻分不清?

产生疑问

我们知道,这两个函数都是对字符串数组进行长度测量的,但是,他们测的东西真的是同一个吗?
我们通过几个实际的例子来看一下这两个函数的区别。

四个例子

情况一:

#include<iostream>
using namespace std;
int main()
{
	char str[10];
	memset(str, 0, 10);//对数组赋初值
	cout << "sizeof(): " << sizeof(str) << endl;//输出sizeof()的结果
	cout << "strlen():" << strlen(str)<<endl;//输出strlen()的结果
}

结果:
在这里插入图片描述
在这个例子中,我们先是使用memset对字符数组进行赋初值,完成后,数组中的元素都是 ‘\0’,表示没有任何元素。
sizeof()的结果是数组的长度,但是strlen()的结果却是0。

情况二:

#include<iostream>
using namespace std;
int main()
{
	char str[10] = {'0','1','2', '3', '4', '5', '6', '7', '8', '9', };
	cout << "sizeof(): " << sizeof(str) << endl;//输出sizeof()的结果
	cout << "strlen():" << strlen(str)<<endl;//输出strlen()的结果
	return 0;
}

结果:
在这里插入图片描述
在这个例子中,数组的长度设置为10,内容也存储了10个字符串,没有给’\0’留位置,此时,sizeof()的结果是正确的,但是strlen()的结果却有点出乎人意料,这是因为我们没有给’\0’留下存储位置,但是strlen()函数计算的终止条件为’\0’,此时strlen()找不到终止符,返回一个随机值。

情况三:

#include<iostream>
using namespace std;
int main()
{
	char str[11] = {'0','1','2', '3', '4', '5', '6', '7', '8', '9', };
	cout << "sizeof(): " << sizeof(str) << endl;//输出sizeof()的结果
	cout << "strlen():" << strlen(str)<<endl;//输出strlen()的结果
	return 0;
}

结果:
在这里插入图片描述
在这个例子中,数组的长度设置为11,内容存储了10个字符串,按照字符的存储规则,最后一位默认是’\0’。此时,sizeof()的结果是这个数组的实际长度,strlen()的结果是数组中存储的有效字符的长度。

情况四:

#include<iostream>
using namespace std;
int main()
{
	char str[11] = { '0','1','2', '3', '4', '5', '6', '7', '8', '9', };
	char* p = str;
	cout << "sizeof(): " << sizeof(p) << endl;//输出sizeof()的结果
	cout << "strlen():" << strlen(p) << endl;//输出strlen()的结果
	return 0;
}

结果:
在这里插入图片描述
在这个例子中,我们使用一个指针来指向这个定义好的字符数组。
sizeof()的结果为8,表示字符指针变量所占的空间大小,64位操作系统为8,32位操作系统为4。
strlen()函数的结果为10,任然是数组的实际有效内容的长度。

总结

通过上述的例子我们可以看到,sizeof()和strlen()的区别有如下几点:

  1. sizeof()是操作符,strlen()是一个C++中的函数。
  2. sizeof()的参数类型更广泛,可以是指针,数组等,甚至可以是函数。strlen()函数的参数范围只能是char*类型的。
  3. 两者计算空间的方式不同,sizeof()是计算操作数所占空间的字节数,不包含’\0’。strlen()是计算字符串长度的一种函数,以为’\0’为计算的终止符。

以上是对sizeof()和strlen()的一些理解,如有错误还请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值