sizeof与strlen的基本区别

来源:互联网 发布:js 骰子的转动效果 编辑:程序博客网 时间:2024/05/01 08:04

sizeof与strlen的基本区别

1.sizeof是运算符,strlen是函数。

2.sizeof可以用类型作参数,

   strlen只能用char* 作参数。

3.数组做sizeof的参数不退化,传递给strlen就退化为指针。

4.sizeof操作符不能返回被动态分配的数组或外部数的数组大尺寸。

5.sizeof计算结构变量的大小时就必须讨论数据对齐问题。

6.sizeof操作符不能用于函数类型、不完全类型(eg:void)或位字段。

7.sizeof在编译是运算,计算的是存储空间的大小。

   strlen在运行时运算,用来测量字符串长度,不括“\0”。

 (ps:sizeof与strlen的返回值均为size_t)

     Eg:以下例子均为32位的系统

           char str[20]=”0123456789”;

           int a=sizeof(str);   //编译时运算--->结果:a=20

           int b=strlen(str);   //运行时运算--->结果:b=10


 

sizeof运算的几种案例

1.计算字符串

   char *str1=“abcdef”;

   char str2[]=“abcdef”;

   int a=sizeof(str1);      // str1是指针,算的是str1指针的存储空间 --->结果:a=4

   Int b=sizeof(str2);      // str2是地址,算的是str2数组的存储空间 --->结果:b=7

 

   Ps:func(int str3[10]);  //这种情况下str3作为指针  存储空间为4字节


2.计算表达式

   char x='a',y='b';

   sizeof(x);             //结果:1字节

   sizeof(x+y);         // x+y表达式整型提升 --->结果:4字节

   sizeof(x= x+y);    // x= x+y表达式整型提升,再截断赋值。--->结果:1字节

   Ps:sizeof并不对表达式求值,x仍然为'a'。

 

3.计算指针数组

   char*argv2[]={"a","de","gh","kydfsd"};

   printf("argv2= %d\n",sizeof(argv2);     //此处计算的是所有指向字符串的指针的存储空间   -->结果:16


4.对函数使用sizeof

  在编译阶段会被函数返回值的类型取代。

  int f1(){return 0;}

  printf("%d\n",sizeof(f1);         //f1返回值为int  -->结果:4


5.计算类

  class A1{

  public:

       int a;

       static int b;

       A1();

      ~A1();

  }

  sizeof(A1) ;   

  //因为静态变量是存在全局数据区的,而sizeof计算栈中分配的大小,是不会计算在内的 --->结果:4


5.计算空类

  空类所占空间为1,单一继承的空类空间也为1,多重继承的空类空间还是1。

  但是虚继承涉及虚表,所占空间为4.