1.79、C++ sizeof 和 strlen 的区别?
本质与计算时机
- •
sizeof
- • 类型:编译时操作符(非函数)。
- • 计算方式:根据数据类型或变量声明时的定义,直接返回其在内存中占用的字节数,不运行代码。
- • 特点:结果由类型决定,与变量值无关。
- •
strlen
- • 类型:运行时函数(需包含
<cstring>
)。 - • 计算方式:从字符串起始地址开始遍历,直到遇到空字符
\0
,统计遍历的字符数(不包含\0
)。 - • 特点:依赖字符串内容,必须确保字符串以
\0
结尾,否则行为未定义。
- • 类型:运行时函数(需包含
适用范围
维度 | sizeof |
strlen |
适用类型 | 所有数据类型(基本类型、数组、结构体、类等)。 | 仅适用于以\0 结尾的C风格字符串(char* 或char[] )。 |
返回值含义 | 类型/变量占用的总字节数(含\0 ,如字符串数组)。 |
字符串中有效字符数(不含\0 )。 |
是否可重载 | 否(操作符固定行为)。 | 是(可自定义实现,但需遵循C风格字符串规则)。 |
典型示例
char str[] = "Hello"; // 数组长度为6(5个字符 + 1个'\0')
char* ptr = str; // 指针指向数组首元素
sizeof(str); // 结果:6(整个数组的字节数)
sizeof(ptr); // 结果:4/8(指针本身的字节数,与平台有关)
strlen(str); // 结果:5(有效字符数,不含'\0')
strlen(ptr); // 结果:5(与strlen(str)等价)
注意事项
- •
sizeof
的数组退化问题
当数组作为函数参数传递时,会退化为指针,此时sizeof
返回指针大小,而非数组大小。void func(char arr[]) { sizeof(arr); // 结果:4/8(指针大小,而非数组实际大小) }
- •
strlen
的越界风险
若字符串未以\0
结尾,strlen
会持续访问内存直到遇到\0
,可能导致越界访问和程序崩溃。
应用场景对比
- •
sizeof
的常见用途- • 计算数组总字节数(如
sizeof(arr) / sizeof(arr[0])
求数组长度)。 - • 确定结构体/类的内存占用(用于内存对齐分析)。
- • 动态内存分配(如
malloc(sizeof(T)*n)
)。
- • 计算数组总字节数(如
- •
strlen
的常见用途- • 计算C风格字符串的有效长度(如字符串拷贝、拼接前获取长度)。
- • 遍历字符串时控制循环边界(如
for(int i=0; i<strlen(s); i++)
)。
总结
特性 | sizeof |
strlen |
核心功能 | 获取类型/变量的内存占用字节数。 | 计算C风格字符串的有效字符数。 |
时机/性质 | 编译时操作,不执行代码。 | 运行时函数,需遍历字符串。 |
关键限制 | 无(但需注意数组退化)。 | 必须确保字符串以\0 结尾。 |
典型场景 | 内存分配、类型大小分析。 | 字符串处理、长度统计。 |
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1771
文章版权归作者所有,未经允许请勿转载。
THE END