产生疑问
我们知道,这两个函数都是对字符串数组进行长度测量的,但是,他们测的东西真的是同一个吗?
我们通过几个实际的例子来看一下这两个函数的区别。
四个例子
情况一:
#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()的区别有如下几点:
- sizeof()是操作符,strlen()是一个C++中的函数。
- sizeof()的参数类型更广泛,可以是指针,数组等,甚至可以是函数。strlen()函数的参数范围只能是char*类型的。
- 两者计算空间的方式不同,sizeof()是计算操作数所占空间的字节数,不包含’\0’。strlen()是计算字符串长度的一种函数,以为’\0’为计算的终止符。
以上是对sizeof()和strlen()的一些理解,如有错误还请指正。