sizeof与strlen的区别

    
sizeof与strlen的区别:
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
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作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型,由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

char * parr = new char[10];

int len_one = strlen(parr);

int len_two = sizeof(parr);

int len_three = sizeof(*parr);

cout << len_one << " and " << len_two << " and " << len_three << endl;

输出结果:23 and 4 and 1

点评:第一个输出结果23实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4);第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。


总结:

(1)sizeof操作符的运算结果类型是size_t,它在头文件中的typedef为unsigned int类型,这种类型保证了能够容纳所建立的对象的最大字节数,其值在编译时即计算好了。

(2)sizeof是运算符,而strlen却是函数。如果sizeof求的不是类型的长度,那么对于变量的长度,也就不需要加括号。

(3)sizeof不仅可以用类型做参数,而且可以用变量做参数,而strlen只能用char*的变量做参数,且要以“\0”为结束符。

(4)数组作为sizeof的参数不退化,而传递给strlen就退化为指针了。

(5)大部分编译程序在编译时就计算了sizeof,得到类型或变量的长度。strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占用的内存的大小。

(6)d当使用一个结构类型或变量时,sizeof返回实际的大小,当使用一静态的空间数组时,sizeof返回全部数组的尺寸;sizeof的操作符不能返回被动态分配的数组或外部的数组的尺寸。

(7)数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小,就要把长度传递过去。

(8)用sizeof计算结构体或变量大小时要考虑数据对齐的问题。

(9)sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型是指未知存储大小的数据类型,如:未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

转载网址:
http://www.cnblogs.com/carekee/articles/1630789.html  
http://lwc541117.blog.163.com/blog/static/1535827882011524102534871/
http://blog.csdn.net/matianlong_0806/article/details/5715843

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值