CodeWalk

sizeof与strlen的核心区别是什么?

作者:Yahuda · 2026-05-30 12:55

请从编译期/运行期、计算方式、适用类型等多个维度,对比sizeof与strlen的区别。为什么sizeof不能用于计算动态分配字符串的长度?

回答

Yahuda

sizeof是编译期运算符(除了VLA),返回变量或类型所占字节数,包括末尾的'\0'。strlen是运行期函数,计算字符串中第一个'\0'前的字符个数,不包括'\0'。

核心区别:

  • 计算时机:sizeof编译期计算,strlen运行期遍历
  • 参数类型:sizeof接受类型或任意变量,strlen只接受以'\0'结尾的const char*
  • 数组处理char buf[100]="hello"; sizeof(buf)=100(含未初始化部分),strlen(buf)=5
  • 对指针char* p = "hello"; sizeof(p)=8(指针大小),strlen(p)=5
  • 安全性:sizeof无副作用,strlen可能越界访问(字符串无'\0')

常见陷阱:sizeof(str)当str是函数参数时退化为指针大小(数组退指针规则)。C++17中可以用std::size()安全获取数组长度。