sizeof 和 strlen 的区别

时间:2023-01-09 20:13:09

sizeof 和 strlen 都是c/c++ 中常见的符号,他们的功能是判断数组长度。那么他么到底有什么区别

1、sizeof    不是函数,而是一个操作符。字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来!  

   strlen      是一个函数,在程序运行期间计算出结果。

2、strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。

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

char str[]="";//str是编译期大小已经固定的数组
int a=strlen(str); //a=10;//strlen()在运行起确定
int b=sizeof(str); //而b=20;sizeof()在编译期确定
char *ptr="hello";
int c=sizeof(ptr); // c=4 , 计算的是所占内存的大小
int d=sizeof(*ptr); // d=1 , 计算所指向字节的内存大小
int e=strlen(ptr); // e=5 , 计算字符串的长度

3、sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

    char c[] = { 'a', 'b', 'c' };
//strlen 必须以'\0'结束,如果没有'\0',则计算结果不可预料
   cout << sizeof(c) << " " << strlen(c) << endl; // output : 3 15

数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,

如: 

fun(char [8])
fun(char [])
都等价于 fun(char *) 
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去 

fun(unsiged char *p1, int len)
{
  unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
}