现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

sizeof和strlen的区别

2018-12-27 20:10 工业·编程 ⁄ 共 1217字 ⁄ 字号 暂无评论

一、sizeof

    sizeof(...)是运算符,而不是一个函数。

    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小

由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。

    实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

    具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:

数组——编译时分配的数组空间大小;

指针——存储该指针地址所用的空间大小(存储该指针的地址的长度是长整型,应该为4);

类型——该类型所占的空间大小;

对象——对象的实际占用空间大小;

函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

例子:

char *str1="absde";

char str2[]="absde";

char str3[8]={'a',};

输出:

sizeof(str1)=4

sizeof(str2)=6;

sizeof(str3)=8;

首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解

str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是指字符串占用的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节

str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"absde"占的总空间。"absde"中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6

str3已经定义成了长度是8的数组,所以sizeof(str3)为8

总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char*="aaa"的写法现在不被提倡,应予以避免。而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。

二、strlen

    strlen(...)是函数,要在运行时才能计算。

参数必须是字符型指针(char*), 且必须是以'\0'结尾的。当数组名作为参数传入时,实际上数组就退化成指针了。

    它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'。返回的长度大小不包括'\0'

给我留言

留言无头像?