sizeof与strlen的区别
1:本质区别
sizeof:属于操作符一类结果类型为size_t ,sizeof操作符的结果类型是size_t。该操作符递的参数可以是变量名,也可以是变量的类型。
例子:
int a;
sizeof(a) == sizeof(int)
sizeof(a) == sizeof a ====> 应为我们说过他是一个操作符,而不是函数没有参数一说.
strlen:是一个标准库
原型:size_t strlen ( const char * str );
参数:是一个char类型的指针
返回值:是参数指针指向的字符串的的长度以'\0'为结束符
参考链接:http://www.cplusplus.com/reference/cstring/strlen/?kw=strlen
例子:
/* strlen example */
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[256];
printf ("Enter a sentence: ");
gets (szInput);
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
2:用法的区别
注:数组做sizeof的参数不退化,传递给strlen就退化为指针
1. 程序在编译的时候就把sizeof计算过了,是类型或是变量的长度。所以sizeof(xxx)可以用来定义数组的大小。
char str[20]=”sizeof and strlen”;
int a=strlen(satr); //a=10;
int b=sizeof(str); //b=20;
2. strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度以’\0’未结束符,而不是占用内存的大小。
3. sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是函数。
4. 当使用一个结构类型或变量时,sizeof返回实际的大小(该结构类型定义变量后,变量占用的内存大小)。当使用一静态的空间数组时(int test[10]),sizeof返回全部数组的尺寸(该数组占用的内存空间:4 * 10)。Sizeof操作符不能返回被动态分配的空间大小,外部的数组的尺寸。
5. 数组作为参数传给函数时传得是指针而不是数组,传递的是数组的首地址。在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小需要在函数里面用memcpy将数组复制出来,长度则需要另一个参数。
6. 计算结构变量的大小就必须讨论数据对其问题。
7. .sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型,未知内容的结构或联合类型,void类型等.
8. sizeof在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
9. strlen要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。 它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。