news 2026/10/13 2:23:06

C语言指针深度剖析:strlen 与 sizeof 核心区别、底层原理、经典面试题一网打尽

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言指针深度剖析:strlen 与 sizeof 核心区别、底层原理、经典面试题一网打尽

前言:

在 C 语言面试与实际开发中, strlen 和 sizeof 是最高频考点之一。
很多同学只记住:

strlen 求字符串长度
sizeof 求占用字节大小

但一旦结合指针、数组、函数传参,立刻出错。

本篇博客从指针本质、内存布局、底层计算规则出发,
让你彻底吃透:什么时候用 strlen?什么时候用 sizeof?指针下它们分别代表什么?

一、最核心一句话总结(背会不吃亏)

  1. sizeof 是运算符,编译期计算,求类型/变量占用的内存字节数。

  2. strlen 是库函数,运行期计算,求字符串真实长度(遇到 \0 停止,不包含 \0 )。

  3. 指针参与时,两者行为完全不同!

二、sizeof 详解:求内存占用大小

  1. 本质

sizeof 计算的是数据类型在内存中占多少字节,和内容无关。

  1. 基本规则
  • char :1 字节

  • int :4 字节

  • 指针 :固定 4/8 字节(32 位/64 位系统)

  • 数组:数组总字节数 = 元素大小 × 元素个数

  1. 指针与 sizeof(超级重点)

只要对指针变量用 sizeof,结果永远是 4 / 8 字节!
哪怕它指向一个数组、一个长字符串。

示例:

结论:sizeof(指针) = 指针大小,永远不看指向的数据!

三、strlen 详解:求字符串有效长度

  1. 本质

strlen 是基于指针遍历的函数:
从传入的地址开始,逐字节向后扫描,直到遇到 \0 停止。
返回的是:走过的字符个数,不包含 \0。

  1. 底层实现(手写 strlen,面试必考)

我们用指针方式实现标准 strlen:

看到了吗?strlen 本质就是指针移动!

  1. strlen 特点
  • 只认字符串,遇到 \0 停

  • 不计入结束符

  • 必须传入有效地址,否则崩溃

  • 和指针类型无关,只看内存里有没有 \0

示例:

四、指针下的 strlen 与 sizeof 终极对比(最易错点)

我们直接看最经典的例子:


最终结论(面试必问)

  1. sizeof(数组) = 数组总大小

  2. sizeof(指针) = 4/8 字节(指针本身大小)

  3. strlen(数组/指针) = 从该地址开始,直到 \0 的字符个数

五、经典面试题(你能全对吗?)

题目 1

答案:
sizeof = 100
strlen = 5

题目 2

答案:
sizeof§ = 4/8
strlen§ = 5

题目 3

答案:4/8
因为数组传参退化为指针!

六、总结(极简版,建议收藏)

  1. sizeof:算内存字节数,编译期执行,指针=4/8字节。

  2. strlen:算字符串长度,运行期执行,指针移动找 \0。

  3. 数组名在 sizeof 中是数组,在其他场合大多是指针。

  4. 指针永远只有 4/8 字节,sizeof 不关心它指向什么!

结尾:

本篇从指针底层彻底讲清了 strlen 与 sizeof,
如果你在面试、刷题、写代码时遇到相关问题,欢迎评论区交流。

原创不易,点赞 + 收藏 + 关注,后续持续更新 C 语言底层干货!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 2:22:19

具身智能中的无线技术——无线线束3

无线技术已实现从低速到超高速的全面覆盖,速率上部分已超越或媲美有线。在低速控制、中速音频及高速骨干层,无线(如星闪、Wi-Fi6/7)凭借低时延、免布线优势正加速取代有线;但在超高速原始数据传输(如自动驾…

作者头像 李华
网站建设 2026/10/13 2:21:15

Redis系统学习与实践:数据类型、持久化与缓存问题全解析

1. 从“会用”到“懂它”:为什么每个后端都应该系统学一遍Redis我最早接触Redis的时候,跟大多数人一样——听说它快,听说它能做缓存,然后就拿它当HashMap用了。直到线上出了几次事故,才意识到自己对Redis的理解太浅了。…

作者头像 李华
网站建设 2026/10/13 2:20:51

RISC-V IDE MRS使用笔记(十三):添加自定义工程模板

RISC-V IDE MRS使用笔记(十三):添加自定义工程模板 在嵌入式开发过程中,有时我们需要基于某些功能代码开发多个工程,此时可以使用MRS的自定义工程模板功能,将需要复用的代码工程添加到内置模板,…

作者头像 李华
网站建设 2026/10/13 2:17:07

PS5游戏兼容技术原理与跨平台运行基础解析

我无法基于当前输入生成符合要求的博文。原因如下:项目标题"AnyPS5"缺乏明确指向性:它既非通用技术术语,也非已知开源项目、SDK、协议或标准名称;在主流技术社区、学术文献及公开资料中,未见权威定义或广泛共…

作者头像 李华
网站建设 2026/10/13 2:16:30

Spring Boot 3.x升级实战:Java 17、GraalVM原生镜像与exe打包避坑指南

Spring Boot 3.x 正式发布后,我第一时间在旧项目里试跑了一次升级。教科书上可能都讲“Java 17是基础要求,支持GraalVM原生镜像”,但实际遇到的第一块砖头不是性能问题,而是编译警告:java: 警告: 源发行版 17 需要目标…

作者头像 李华