sizeof()和strlen()用法

来源:互联网 发布:安卓浏览器内核源码 编辑:程序博客网 时间:2024/04/29 09:52

1、sizeof( )是运算符,不是函数。

      在编译时计算,因此不能用来返回动态分配(malloc)的内存空间的大小。

2、strlen( )是函数,要在运行时才能计算。

      函数的参数必须是字符型指针(char *),必须是以'\0'结尾的。

      strlen所作的仅仅是一个计数器的工作,它从内存的某个位置开始计算,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含“\0”)。

注意:当数组名作为strlen的函数参数传入时,实际上数组就退化成指针了。

举例1:    

char *s = "0234567";sizeof(s); 结果 4 ===》s是指向字符串常量的字符指针sizeof(*s); 结果 1 ===》*s是第一个字符//大部分编译程序,在编译的时候就把sizeof计算过了,是类型或是变量的长度

举例2:

char arr[10] = "Hello";int len_str = strlen(arr);int len_sizeof = sizeof(arr); cout << len_str << " and " << len_sizeof << endl; //输出结果为:5 and 10
当arr是数组时,sizeof返回的是编译器为其分配的数组空间大小,不关心里面存了多少数据。

strlen只关心存储的数据内容,不关心空间的大小和类型。

注意:sizeof在不同平台的值并不一样

举例3:

char szPath[MAX_PATH];//如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH//但是将szPath作为虚参声明时void fun(char szPath[MAX_PATH]);sizeof(szPath);却会是4(指针大小)

其实理解 sizeof 只需要抓住一个要点:栈

程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;

动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。

#include "iostream"using namespace std;class Base  {  virtual void VirtualFun();  };  class D1:Base  {  int i;      void NonVirtualFun();  };  class D2:D1  {      D1 *pD2;  };  class D3:D2  {      static int i;      static int GetIndex();  };  void main()  {      printf("%d\n",sizeof(Base));//4 虚函数(虚函数表)会占4个字节,一个类至少有1个字节(char型)来区分不同的类      printf("%d\n",sizeof(D1));//8 函数不算在内,int是4个字节      printf("%d\n",sizeof(D2));//12 比上一个多了一个指针      printf("%d\n",sizeof(D3));//12 static类型的变量(函数)不算在对象内,整个类共享      system("pause");  }  

#include <stdio.h>  int main()  {      printf("%d\n", sizeof(int));     // 4      printf("%d\n", sizeof(long));    // 4    printf("%d\n", sizeof(float));   // 4      printf("%d\n", sizeof(double));  // 8      printf("%d\n", sizeof(void*));   // 4 指针类型的为4     return 0;  } 
#include <stdio.h> #include<string.h> int main()  {      char *s="hello";    printf("%d\n", sizeof(s));   // 4 指针类型的为4     printf("%d\n", sizeof(*s));  // 1 指向字符串的首地址 为1    printf("%d\n", strlen(s));   // 5 长度为5 不包括'\0'    //s[0]='a'; //编译时没有错误 但是运行时会出现停止运行 常量字符串    puts(s);    return 0;   } 
0 0
原创粉丝点击