当前位置: 首页 > 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 用于获取字符串逻辑长度,需在运行时遍历字符串内容。理解二者的本质差异,可避免内存管理和字符串处理中的常见错误。

相关文章:

  • 【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)的原理与应用
  • 中海宏洋集团4.17亿元竞得浙江绍兴宅地,溢价率20.87%
  • 美国那点事|特朗普的“刀”砍向国务院,美国霸权迎来历史拐点?
  • 动力电池、风光电设备退役潮来袭,国家队即将推出“再生计划”
  • 中方决定对在涉港问题上表现恶劣的美国国会议员、官员和非政府组织负责人实施制裁
  • 全国登记在册民营企业超过5700万户,占企业总量92.3%
  • 成功卫冕!孙颖莎4比0战胜蒯曼,获澳门世界杯女单冠军