sizeof 返回内存字节数(含'\0'),strlen 返回有效字符个数(不含'\0');前者编译期确定,后者运行时依赖'\0'存在。

直接说结论:用 sizeof 算的是内存字节数(含 '\0'),用 strlen 算的是有效字符个数(不含 '\0');前者编译期就定死,后者必须运行时才出结果,且依赖 '\0' 存在。
为什么 sizeof 对字符数组返回值比 strlen 多 1?
因为 sizeof 统计的是整个数组分配的内存空间,而字符串字面量初始化的字符数组(如 char s[] = "abc")会自动补一个结尾的 '\0'。这个 '\0' 占 1 字节,sizeof 算进去,strlen 不算。
-
char s1[] = "abc"→sizeof(s1)是 4,strlen(s1)是 3 -
char s2[10] = "abc"→sizeof(s2)是 10(整个数组大小),strlen(s2)还是 3 -
char s3[] = {'a','b','c'}→sizeof(s3)是 3,但strlen(s3)行为未定义(没'\0',会越界读)
sizeof 在函数参数里突然变小,strlen 却不受影响
数组传进函数时自动退化成指针,sizeof 就只能拿到指针大小(通常是 8 字节),而 strlen 只关心指针指向的内容是否以 '<p>数组传进函数时自动退化成指针,<code>sizeof 就只能拿到指针大小(通常是 8 字节),而 strlen 只关心指针指向的内容是否以 '\0' 结尾,所以还能正常工作。
- 写
void f(char arr[]) { sizeof(arr); }→ 实际等价于sizeof(char*),不是原数组大小 - 但
strlen(arr)仍可正确返回字符串长度,只要arr指向的是合法 C 字符串 - 想在函数内安全获取数组长度?要么传入额外长度参数,要么改用
std::array或std::string
什么时候该用 sizeof,什么时候非用 strlen 不可?
sizeof 适合静态数组长度推导、内存分配大小计算、类型对齐检查;strlen 只用于已知是 C 风格字符串、且需要知道“人眼可见字符数”的场景。
- 分配缓冲区:用
malloc(sizeof(char) * (strlen(src) + 1))—— 这里必须用strlen算内容长度,再加 1 给'\0' - 计算元素个数:对静态数组
int a[5],用sizeof(a)/sizeof(a[0])安全;但对char* p = "hello",sizeof(p)毫无意义 - 误用风险:把普通
char[](没初始化或没'\0')直接喂给strlen,程序可能崩溃或返回垃圾值
最易被忽略的一点:sizeof 看的是声明,strlen 看的是运行时内存状态;前者不关心内容,后者极度依赖 '\0' 的存在和位置。一旦数组没正确终结,strlen 就不再是“求长度”,而是“赌运气”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











