1. 本质与用途
-
strlen
✂️-
本质:标准库函数(定义在
<string.h>
)。 -
作用:计算字符串的实际长度(直到
\0
,不包含它本身)。 -
示例:
char str[] = "hello"; printf("%zu", strlen(str)); // 输出 5
-
-
sizeof
📦-
本质:编译期运算符,不是函数。
-
作用:获取变量或类型占用的总内存字节数(包括
\0
、padding 等)。 -
示例:
char str[] = "hello"; printf("%zu", sizeof(str)); // 输出 6(含 \0)
-
2. 核心区别对比
特性 | strlen ✂️ | sizeof 📦 |
---|---|---|
作用对象 | 仅适用于 C 字符串 | 适用于所有变量、类型、表达式 |
计算时机 | 运行时 依赖字符串内容 | 编译时 直接计算内存大小 |
结果含义 | 字符数(不含 \0 ) | 总占用字节(含 \0 、类型结构) |
依赖条件 | 必须以 \0 结尾,否则行为未定义 | 与是否是字符串无关,类型决定结果 |
3. 场景对比示例
✅ 示例 1:字符数组
char str[] = "hello";
strlen(str); // → 5
sizeof(str); // → 6(包含 \0)
✅ 示例 2:指针变量
char *str = "hello";
strlen(str); // → 5
sizeof(str); // → 8(64位系统下指针大小)
✅ 示例 3:部分初始化
char str[10] = {'a', 'b', 'c'};
strlen(str); // → 3(遇到第一个 \0 停止)
sizeof(str); // → 10(数组大小)
✅ 示例 4:非字符串数据
int arr[] = {1, 2, 3};
sizeof(arr); // → 12(3 * 4字节)
strlen(arr); // ❌ 错误!不是字符串!
4. 常见误区警告
-
⚠️ 把
sizeof
当成字符串长度函数char *str = "hello"; sizeof(str); // 是指针大小,不是字符串长度!
-
⚠️ 数组 vs 指针混用
char str[10]; sizeof(str); // → 10(数组) char *p = str; sizeof(p); // → 8(指针)
-
⚠️ 未加
\0
尾的字符串会让strlen
越界char str[3] = {'a', 'b', 'c'}; strlen(str); // ❌ 未定义行为!没有 \0 结束!
5. 小结口诀
strlen 看内容,遇 '\0' 停;
sizeof 看类型,静态分明。
-
✂️
strlen
:运行时计算字符串长度,适合内容处理。 -
📦
sizeof
:编译时获取内存大小,适合内存管理。