sizeof与strlen的核心区别是什么?
请从编译期/运行期、计算方式、适用类型等多个维度,对比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()安全获取数组长度。