前言:
在 C 语言面试与实际开发中, strlen 和 sizeof 是最高频考点之一。
很多同学只记住:
strlen 求字符串长度
sizeof 求占用字节大小
但一旦结合指针、数组、函数传参,立刻出错。
本篇博客从指针本质、内存布局、底层计算规则出发,
让你彻底吃透:什么时候用 strlen?什么时候用 sizeof?指针下它们分别代表什么?
一、最核心一句话总结(背会不吃亏)
sizeof 是运算符,编译期计算,求类型/变量占用的内存字节数。
strlen 是库函数,运行期计算,求字符串真实长度(遇到 \0 停止,不包含 \0 )。
指针参与时,两者行为完全不同!
二、sizeof 详解:求内存占用大小
- 本质
sizeof 计算的是数据类型在内存中占多少字节,和内容无关。
- 基本规则
char :1 字节
int :4 字节
指针 :固定 4/8 字节(32 位/64 位系统)
数组:数组总字节数 = 元素大小 × 元素个数
- 指针与 sizeof(超级重点)
只要对指针变量用 sizeof,结果永远是 4 / 8 字节!
哪怕它指向一个数组、一个长字符串。
示例:
结论:sizeof(指针) = 指针大小,永远不看指向的数据!
三、strlen 详解:求字符串有效长度
- 本质
strlen 是基于指针遍历的函数:
从传入的地址开始,逐字节向后扫描,直到遇到 \0 停止。
返回的是:走过的字符个数,不包含 \0。
- 底层实现(手写 strlen,面试必考)
我们用指针方式实现标准 strlen:
看到了吗?strlen 本质就是指针移动!
- strlen 特点
只认字符串,遇到 \0 停
不计入结束符
必须传入有效地址,否则崩溃
和指针类型无关,只看内存里有没有 \0
示例:
四、指针下的 strlen 与 sizeof 终极对比(最易错点)
我们直接看最经典的例子:
最终结论(面试必问)
sizeof(数组) = 数组总大小
sizeof(指针) = 4/8 字节(指针本身大小)
strlen(数组/指针) = 从该地址开始,直到 \0 的字符个数
五、经典面试题(你能全对吗?)
题目 1
答案:
sizeof = 100
strlen = 5
题目 2
答案:
sizeof§ = 4/8
strlen§ = 5
题目 3
答案:4/8
因为数组传参退化为指针!
六、总结(极简版,建议收藏)
sizeof:算内存字节数,编译期执行,指针=4/8字节。
strlen:算字符串长度,运行期执行,指针移动找 \0。
数组名在 sizeof 中是数组,在其他场合大多是指针。
指针永远只有 4/8 字节,sizeof 不关心它指向什么!
结尾:
本篇从指针底层彻底讲清了 strlen 与 sizeof,
如果你在面试、刷题、写代码时遇到相关问题,欢迎评论区交流。
原创不易,点赞 + 收藏 + 关注,后续持续更新 C 语言底层干货!