1.sizeof 和 strlen 的区别-灵析社区

菜鸟码转

  • strlen 是头文件 <cstring> 中的函数,sizeof 是 C++ 中的运算符。strlen 测量的是字符串的实际长度(其源代码如下),以 \0 结束,而 sizeof 测量的是对象或者表达式类型占用的字节大小。strlen 源代码如下:

C++

size_t strlen(const char *str) {
    size_t length = 0;
    while (*str++)
        ++length;
    return length;
}

举例:

C++

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char arr[10] = "hello";
    cout << strlen(arr) << endl; // 5
    cout << sizeof(arr) << endl; // 10
    return 0;
}

若字符数组 arr 作为函数的形参,sizeof(arr) 中 arr 被当作字符指针来处理,strlen(arr) 中 arr 依然是字符数组,从下述程序的运行结果中就可以看出。

C++

#include <iostream>
#include <cstring>

using namespace std;

void size_of(char arr[])
{
    cout << sizeof(arr) << endl; // warning: 'sizeof' on array function parameter 'arr' will return size of 'char*' .
    cout << strlen(arr) << endl; 
}

int main()
{
    char arr[20] = "hello";
    size_of(arr); 
    return 0;
}
/*
输出结果:
8
5
*/
  • 二者的不同之处:

strlen 本身是库函数,因此在程序运行过程中,计算长度;而 sizeof 是在编译时计算长度;sizeof 的参数可以是类型,也可以是变量,且必须是完整类型;strlen 的参数必须是 char * 类型的变量。

sizeof 接受的参数可以是对象也可以是表达式,但是 sizeof(expression) 在运行时不会对接受的表达式进行计算,编译器只会推导表达式的类型从而计算占用的字节大小;而 strlen 是一个函数,如果接受表达式则会对表达式进行运算。

C++

  #include <iostream>
  using namespace std;
  int main(int argc, char * argv[])
  {
      int x = 4;
      char *s = "12345678";
      char *p = s;
      sizeof(x++);
      printf("%d\n", x);
      strlen(p++);
      return 0;
  }

对于 C99 中结构体允许最后一个变量为不定长数组,sizeof 则不计算空间。

C++

  #include <iostream>
  #include <cstring>

  using namespace std;

  struct flexarray {
      int val;
      int array[];  /* Flexible array member; must be last element of struct */
  };

  int main()
  {
      printf("%ld\n", sizeof(struct flexarray)); // 4
  }


阅读量:2013

点赞量:0

收藏量:0