sizeof、strlen
2015-07-10 14:35
204 查看
一、sizeof
sizeof(...)是运算符,sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,是以字节为单位进行计数的。所以位域成员不
能用sizeof进行计算。参数可以是数组、指针、类型、对象、函数等。
功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的
空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4 字节byte);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
例如:
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
二、strlen
头文件:string.h
函数: int strlen(char *s);
格式:strlen
(字符数组名、指针,且必须是以'\0'结尾的)
功能:计算字符串s的(unsigned
int型)长度,不包括'\0'在内。
例如:
int
ac[10];
cout<<sizeof(ac)<<endl;(结果是40
byte)
cout<<strlen(ac)<<endl;
(ac相当于一个指针,但是strlen只能接受char*类型,所以编译时出错)
char
aa[10]={'\0'};
cout<<strlen(aa)<<endl;
//结果为0
class
X{ int i; int j; char k;};X x;
cout<<sizeof(X)<<endl;
结果 12 ===》内存补齐
cout<<sizeof(x)<<endl;
结果 12 同上
char
szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为函数参数时,sizeof(szPath)却会是4(指针大小)
char ca1[] = {‘C’,'++' };
char ca2[] = {‘C’,'++'
,‘\0’};
故strlen(ca1)的值未定义,而strlen(ca2)=2。
sizeof(...)是运算符,sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,是以字节为单位进行计数的。所以位域成员不
能用sizeof进行计算。参数可以是数组、指针、类型、对象、函数等。
功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的
空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4 字节byte);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
例如:
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
二、strlen
头文件:string.h
函数: int strlen(char *s);
格式:strlen
(字符数组名、指针,且必须是以'\0'结尾的)
功能:计算字符串s的(unsigned
int型)长度,不包括'\0'在内。
例如:
int
ac[10];
cout<<sizeof(ac)<<endl;(结果是40
byte)
cout<<strlen(ac)<<endl;
(ac相当于一个指针,但是strlen只能接受char*类型,所以编译时出错)
char
aa[10]={'\0'};
cout<<strlen(aa)<<endl;
//结果为0
class
X{ int i; int j; char k;};X x;
cout<<sizeof(X)<<endl;
结果 12 ===》内存补齐
cout<<sizeof(x)<<endl;
结果 12 同上
char
szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为函数参数时,sizeof(szPath)却会是4(指针大小)
char ca1[] = {‘C’,'++' };
char ca2[] = {‘C’,'++'
,‘\0’};
故strlen(ca1)的值未定义,而strlen(ca2)=2。
相关文章推荐
- 【程序员联盟】官网上线啦!coderunity.com
- Js 小技巧
- 汇编语言:第六章 编写多个段的程序
- mysql查找表名
- ORACLE创建定时任务
- skip_grant_tables与半同步的冲突
- Android的ListView中判断其内容已滚动到最顶部或者最底部
- 谁也不该供着谁
- 如何优化UITableView的性能
- Pig基础学习【持续更新中】
- 基于CDH5部署Spark记录
- linux双网卡绑定
- linux双网卡绑定
- Windows下登录UNIX或Linux服务器主机的软件
- 网络编程I/O功能介绍
- string 至 Color 转换演示示例:
- .net反射(原:http://www.cnblogs.com/knowledgesea/archive/2013/03/02/2935920.html)
- 修改jmeter jvm参数
- java JDBC应用(一)——PraparedStatement对象
- Java线程池学习笔记二