当前位置: 首页 > news >正文

sizeof和strlen的区别

sizeof 和 strlen 的区别与应用

基本概念
- sizeof 是编译时运算符
  - 功能:获取类型或对象占用的内存字节数
  - 特点:编译器在编译阶段完成计算,不涉及实际数据内容
- strlen 是运行时库函数
  - 功能:计算C风格字符串的有效字符长度(不包含终止符\0)
  - 特点:需在运行时遍历字符串内容直到遇到\0

sizeof 应用场景
1. 基础类型计算
   - 示例:sizeof(int) 返回整型占用的字节数
2. 复合类型分析
   - 示例:sizeof(MyClass) 计算类/结构体的内存占用
3. 静态数组计算
   - 示例:int arr[10]; sizeof(arr) 返回整个数组的字节大小
4. 指针注意事项
   - 示例:int* p = new int[10]; sizeof(p) 返回指针变量本身的大小

strlen 使用要点
1. 字符串长度计算
   - 示例:char arr[] = "Hello"; strlen(arr) 返回5
2. 使用限制
   - 必须处理以\0结尾的有效字符串
   - 错误示例:char arr[5] = {'a','b'}; strlen(arr) 会导致未定义行为

关键差异对比
1. 动态内存场景
   - sizeof 无法获取动态分配内存的实际容量
   - 正确做法:需自行记录分配时的容量参数
     int* arr = new int[n];
     // sizeof(arr) 仅返回指针大小
2. 特殊类型处理
   - 空类示例:
     class EmptyClass {};
     sizeof(EmptyClass) 至少为1字节(保证对象唯一地址)

常见误区警示
1. 指针与数组混淆
   - 数组作为参数传递时会退化为指针
   - 示例:
     void func(char arr[10]){
         sizeof(arr); // 返回指针大小而非数组大小
     }
2. 字符串终止符问题
   - 未正确终止的字符数组使用strlen会导致内存越界

实践建议
1. sizeof 使用场景
   - 内存分配计算
   - 数据结构序列化
   - 类型大小验证(跨平台开发)
2. strlen 使用场景
   - 用户输入验证
   - 字符串处理逻辑
   - 缓冲区边界检查

总结
sizeof 用于获取内存布局信息,编译器在编译阶段即可确定结果。strlen 用于获取字符串逻辑长度,需在运行时遍历字符串内容。理解二者的本质差异,可避免内存管理和字符串处理中的常见错误。

http://www.dtcms.com/a/150949.html

相关文章:

  • 【Java学习笔记】循环结构
  • 翻倍缠论系统+拐点多空雷达,组合指标的使用操盘技术
  • J1800主板刷黑群晖
  • 基于VTK的光线投影法体绘制
  • SSE(Server-Sent Events)技术详解:轻量级实时通信的全能方案
  • Android将启动画面实现迁移到 Android 12 及更高版本
  • gbase8s存储学习一 rootdbs存储结构以及寻址分析
  • 【Java面试笔记:基础】10.如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
  • Android 中解决 RecyclerView 和子控件之间的滑动冲突问题
  • 文档构建:Sphinx全面使用指南 — 进阶篇
  • Android TV 输入框架(TIF)深度解析与实践指南
  • 【Java学习日记25】:带返回值的方法
  • 【6D位姿估计】Foundation Pose复现
  • 【LangChain4j】AI 第二弹:项目中接入 LangChain4j
  • 从入门到精通:CMakeLists.txt 完全指南
  • 【MQ篇】RabbitMQ之工作队列模式!
  • 【无标题】spark安装部署
  • 16.第二阶段x64游戏实战-分析二叉树结构
  • CAMAT
  • FreeRTOS深度解析:队列集(Queue Sets)的原理与应用
  • 域名 → IP 的解析全过程
  • 【PCB工艺】推挽电路及交越失真
  • 厚铜PCB制造中的散热结构工艺控制要点
  • 探秘Transformer系列之(30)--- 投机解码
  • JavaScript 改变this指向
  • LeetCode第164题_最大间距
  • 图文结合 - 光伏系统产品设计PRD文档 -(慧哥)慧知开源充电桩平台
  • 前端 JavaScript 处理流式响应的坑
  • DeepSeek+Mermaid:轻松实现可视化图表自动化生成(附实战演练)
  • Ubuntu使用war包部署Jenkins并通过systemcl管理