天天看点

strlen 和 sizeof 的区别

首先,让我们先了解一些strlen和sizeof的定义 :

一、strlen

1、strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。注:用char s[6] = “string”; 这种初始化方法时, 后面的常量字符串"string"占7字节, 最后一个字节为’\0’。如果你用char s[6] = {‘s’,‘t’,‘r’,‘i’,‘n’,‘g’};这种方式并不能将s初始化为一个字符串. 没有以’\0‘结尾,’它只是一个容纳了char的数组. 只有以’\0’结尾的char数组才能称之为字符串.

2、strlen是一个函数。strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。注:这里需要特别注意,strlen求的是字符串实际长度。如 int a[ 5 ] ={1,2,3,4,5} strlen(a) //错误,数组a不是字符数组。

二、sizeof

1、在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。注:记住是内存字节数,具体的数据类型对应具体的字节数。

三、两者的区别

样例1:

#include

#include

using namespace std;

int main(void)

{

char aa[200]={’\0’};

cout<<strlen(aa)<<endl;

return 0;

}

/这个样例结果为0而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个取字节运算符,

strlen是函数。/

样例2:

#include

#include

using namespace std;

int main(void)

{

char aa[200]=“Hello, World!”;

cout<<strlen(aa)<<endl;

return 0;

}

/这个样例的结果为13(逗号后面有一个空格)/

样例3:

#include

#include

using namespace std;

int main(void)

{

char aa[200]=“hello”;

cout << strlen(aa) << endl;

return 0;

}

//这个样例的结果为5

sizeof(aa); //返回200

int a[10];

sizeof(a)

//返回40 (根据语言int型 c/c++由编译器决定是两个或四个 java 是四个)

1、对静态数组的处理:

char str[20000]=“0123456789”;

int a=strlen(str); //a=10; >> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。

int b=sizeof(str); //而b=20000; >> sizeof 计算的则是分配的数组 str[20000] 所占的内存空间的大小,不受里面存储的内容改变。

2、对指针的处理:

char* ss = “0123456789”;

sizeof(ss) //结果 4>>ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的值所占的空间,是char*类型,所以是4

sizeof(*ss) //结果 1>> *ss是第一个字符 其实就是获得了字符串的第一位’0’ 所占的内存空间,是char类型的,占了 1 位

strlen(ss)= 10 //>> 如果要获得这个字符串的长度,则一定要使用 strlen

//sizeof返回对象所占用的字节大小. 正确

//strlen返回字符个数. 正确

在使用strlen时,有一个很特别的情况,就是数组名到指针蜕变

char Array[2000] = {‘0’};

sizeof(Array) == 2000;

char *p = Array;

strlen( p ) = 1; //结果为1

sizeof( p )= 4 //结果为4

//在传递一个数组名到一个函数中时,它会完全退化为一个指针

部分内容参考自百度百科

继续阅读