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

sizeof和strlen的对比分析

目录

一、sizeof运算符

1、基本特性

2、使用示例

3、注意事项

二、strlen函数

1、函数原型

2、基本特性

3、使用示例

4、注意事项

三、sizeof与strlen的对比

关键区别示例

对于字符数组char arr[] = "abc";:

对于指针char *p = "abc";:

四、总结


一、sizeof运算符

sizeof是C语言中的一个重要运算符,用于计算变量或类型所占内存空间的大小,单位为字节。

1、基本特性

  • 操作符性质sizeof是单目运算符,不是函数

  • 计算对象可以计算变量、数据类型或表达式的大小

  • 计算时机在编译时确定结果,不会在运行时计算

  • 数据无关性只关注内存空间大小,不关心内存中存储的具体数据

2、使用示例

#include <stdio.h>int main()
{int a = 10;printf("%zu\n", sizeof(a));    // 计算变量大小printf("%zu\n", sizeof a);     // 括号可省略(仅变量时)printf("%zu\n", sizeof(int));  // 计算类型大小return 0;
}

3、注意事项

  1. sizeof用于变量时,括号可以省略(如sizeof a

  2. sizeof用于类型时,括号必须保留(如sizeof(int)

  3. 建议使用%zu格式说明符输出sizeof的结果(size_t类型)


二、strlen函数

strlen是C标准库中的字符串函数,用于计算字符串长度。

1、函数原型

size_t strlen(const char *str);

2、基本特性

  • 库函数:需要包含<string.h>头文件

  • 计算方式:从给定地址开始,统计直到遇到'\0'之前的字符数量

  • 终止条件:依赖字符串末尾的'\0'(空字符)

  • 时间复杂度:O(n),需要遍历整个字符串

3、使用示例

#include <stdio.h>
#include <string.h>int main()
{char arr1[3] = {'a', 'b', 'c'};  // 未以'\0'结尾char arr2[] = "abc";             // 自动包含'\0'printf("%zu\n", strlen(arr1));   // 结果不可预测,可能越界访问printf("%zu\n", strlen(arr2));   // 正确结果:3printf("%zu\n", sizeof(arr1));   // 3字节printf("%zu\n", sizeof(arr2));   // 4字节(包含'\0')return 0;
}

4、注意事项

  1. 必须确保字符串以'\0'结尾,否则会导致未定义行为

  2. 不会计算'\0'本身

  3. 对非字符串缓冲区使用strlen是危险的


三、sizeof与strlen的对比

特性sizeofstrlen
性质运算符库函数(需包含<string.h>)
计算内容内存空间大小(字节)'\0'前的字符数量
参数类型变量、类型或表达式必须以'\0'结尾的字符串指针
执行时机编译时运行时
空字符处理计入大小(如果是数组一部分)不计入长度(作为结束标志)
安全性总是安全的可能越界访问(若无'\0')
典型返回值数组总大小字符串实际长度

关键区别示例

对于字符数组char arr[] = "abc";:

  • sizeof(arr)返回4(包括'\0')

  • strlen(arr)返回3(不包括'\0')

对于指针char *p = "abc";:

  • sizeof(p)返回指针大小(通常4或8字节)

  • strlen(p)返回3


四、总结

理解sizeofstrlen的区别对于C语言编程至关重要:

  1. sizeof是编译时运算符,用于确定内存大小

  2. strlen是运行时函数,用于确定字符串长度

  3. 使用strlen时必须确保字符串正确终止

  4. 数组名在sizeof中返回整个数组大小,而作为参数传递时会退化为指针

正确使用这两个工具可以避免常见的内存和字符串处理错误。

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

相关文章:

  • vue从入门到精通:搭建第一个vue项目
  • kali linux从入门到精通教程
  • 【GM3568JHF】FPGA+ARM异构开发板烧录指南
  • Go并发编程-goroutine
  • 智能人形机器人:知识驱动的工业生产力革新
  • 视觉语言导航(11)——预训练范式 4.1
  • 系统架构师考试-操作系统-10道关于PV操作和死锁的模拟题
  • 实现一个函数,使用引用作为参数完成三个字符串按长度排序,最长的字符串放入第一个参数,最短的字符串放入第三个参数(不允许使用 string)
  • Linx--MySQL--安装笔记详细步骤!
  • 石英挠性加速度计:高精度测量的理想之选?
  • Windows安装python
  • 使用 uv管理 Python 虚拟环境:比conda更快、更轻量的现代方案
  • Baumer高防护相机如何通过YoloV8深度学习模型实现手势识别和指尖检测识别(C#代码UI界面版)
  • Java基础数据类型笔试面试中的“坑”
  • 第4章-04-用WebDriver页面元素操作
  • C 语言数据结构与算法的复杂度分析:从理论到实战的效率衡量指南
  • Qwen Code宣布每天免费调用2000次,且无Token限制
  • Webrtc在项目中承担的角色
  • 20250818在荣品的PRO-RK3566开发板跑Buildroot的时候使用在线秒表https://tool.hiofd.com/stopwatch/
  • 【iOS】Block补充
  • 一道同分排名的SQL题
  • 多智能体架构设计:从单Agent到复杂系统的演进逻辑
  • Mind GPT:理想汽车发布的多模态大模型
  • 20. 云计算-云服务模型
  • 基于SpringBoot+Uniapp的互联网订餐小程序(协同过滤算法、Echarts图形化分析)
  • 机器人技术核心模块与前沿趋势总结
  • k8sday10服务发现(1/2)
  • 简述:普瑞时空数据建库软件(国土变更调查建库)之一(批量变更图斑)
  • 华为GaussDB的前世今生:国产数据库崛起之路
  • 151-基于Python的心衰疾病数据可视化分析系统