当前位置: 首页 > 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.xdnf.cn/news/94375.html

相关文章:

  • URP-UGUI交互功能实现
  • NLP高频面试题(五十三)——LLM中激活函数详解
  • 【无人机】无人机光流模块Optical Flow设置(三),光流测距一体传感器的配置。凌启科技的光流测距一体模块的测试。
  • 珈和科技助力“农险提效200%”!“遥感+”技术创新融合省级示范项目荣登《湖北卫视》!
  • Javashop新零售电商系统:构建智能零售生态的终极解决方案
  • 【android bluetooth 框架分析 03】【Bta 层详解 1】【Bluetooth Application Laye 介绍】
  • 5.4.云原生与服务网格
  • 数据为基:机器学习中数值与分类数据的处理艺术及泛化实践
  • C++ 容器查找效率
  • Java基础:认识注解,模拟junit框架
  • 如何提升个人解决问题的能力?
  • Ethan独立开发产品日报 | 2025-04-22
  • CS 系列 USB3.0 工业面阵相机不同快门类型的作用及其区别
  • 从边缘到云端,如何通过时序数据库 TDengine 实现数据的全局洞
  • 神经网络相关内容
  • JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践
  • AI与Web3.0:技术融合
  • python动态注册执行action
  • QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
  • 单片机外设模块汇总与介绍
  • 动态规划(一)【背包】
  • cf | Binary Typewriter
  • Hive 多表查询案例
  • poi生成横向文档以及复杂表头
  • 【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择
  • 【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
  • 敏捷开发中的AI测试:未来的趋势与挑战
  • ubantu18.04(Hadoop3.1.3)Hive3.1.2安装指南
  • 静态存储区(Static Storage Area)的总结
  • 深入解析:C 语言实现快速傅里叶变换(FFT)算法