嗯,这个是突然想到的东西,以前学C语言的时候好像还比较熟悉,隔了好久现在一点都不清楚了,所以重新翻阅了一些资料,下面写下总结:
首先对字符串要有一个了解,每个字符串的最后都有一个隐含的字符 ‘\0‘ ,标识该字符串的结束。
----------------------------------------------------------------------------------------------------------------------------------------------------
要说明的是,sizeof(...)不是函数,而是一个运算符,参数可以是数组,指针,类型,对象,函数等。。。
其功能是:获得保证能容纳实现所建立的最大对象的字节大小。而且,sizeof()是在编译时进行计算,所以不能
返回动态分配的内存空间的大小。此外,sizeof()在返回类型,静态分配的数组,指针,对象,函数等时,返回
值跟其所存储的内容无关,具体的来说:
返回值的含意如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
后面在分析完strlen()之后我会上一个例子供大家参考。
----------------------------------------------------------------------------------------------------------------------------------------------------
相比sizeof(),strlen()是一个函数,在程序运行时进行计算。strlen()的参数必须是字符型指针(char*),而且
必须是以 ‘\0‘ 结尾的,这点要注意,如果没有,那么其返回的值是不确定的。如果开的数组是这样的:
char a[] = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E’};
由于没有手动加 ‘\0‘进去,所以当原来的地址里还有其他字符串时,这时strlen()的返回值就不确定了。
当数组名作为参数传入时,数组就退化指针了,这一点必须注意!!!
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符‘\0‘。返回的长度大小不包括‘\0‘。
-----------------------------------------------------------------------------------------------------------------------------------------------------
总结 :
sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据,同时,读取字符串结尾的 ‘\0‘。
strlen只关心存储的数据内容,不关心空间的大小和类型, 不读取字符串结尾的 ‘\0‘。
下面是一个小测试代码:
#include <iostream>
#include <cstring>
int main()
{
using namespace std;
char a[20] = "happybird???";
cout << sizeof(int) << endl;
cout << sizeof(char) << endl;
cout << sizeof("what‘s this?") << endl;
cout << sizeof(a) << endl;
cout << strlen(a) << endl;
cout << strlen("what‘s this?") << endl;
return 0;
}
自己的总结不足,下面是程序员面试宝典上的总结,供大家品评:
C语言里strlen和sizeof的区别,布布扣,bubuko.com
原文:http://blog.csdn.net/loveronger1314/article/details/23431913