sizeof 与 strlen 的区别

来源:互联网 发布:智能家居网络协议 编辑:程序博客网 时间:2024/05/21 09:39

sizeofstrlen的区别

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。

 

 

0 0