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