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

深入解析sizeof和strlen的区别与联系

目录

一、深度解析

1.sizeof

2.strlen 

二、对比

三、举例说明

总结 


大家好,今天我们来探讨一下C语言中两个常用的函数sizeof和strlen。虽然它们都与字符串有关,但它们的用途和实现原理却大相径庭。下面我将从以下几个方面进行对比分析:

一、深度解析

1.sizeof

定义:

sizeof是一个操作符用于获取数据类型或变量在内存中所占的字节数。它是一个编译时运算符,其结果在编译时就已经确定。

 参数类型:

sizeof可以接受两种参数:数据类型和变量。例如:

sizeof(int);    // 返回int类型所占的字节数
sizeof(a);      // 返回变量a所占的字节数

sizeof 计算变量所占内存内存空间⼤⼩,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。如果数组是字符串时,sizeof 计算数组大小时包括了结尾的空字符(‘\0’)。

返回值:

sizeof 返回的是数据类型或变量所占用的字节数,类型为 size_t(无符号整数类型)

2.strlen 

定义:

strlen是一个函数,(所需的头文件为<string.h>)用于计算字符串的实际长度,不包括结尾的空字符(‘\0’)。它是在运行时进行计算,返回值为字符串的实际长度。

函数原型:

size_t strlen ( const char * str );

 参数类型:

strlen的参数必须是一个以空字符(‘\0’)结尾的字符串。例如:

strlen("hello world");  // 返回11,不包括结尾的空字符
strlen统计的是从该函数的参数 str 中这个地址开始向后,\0 之前字符串中字符的个数。
strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。
返回值:
strlen 返回的是字符串中不包括结尾空字符(‘\0’)的字符数,类型也是 size_t(无符号整数类型)

二、对比

sizof与strlen对比
sizeofstrlen
sizeof是操作符strlen是库函数
sizeof计算操作数所占内存的⼤⼩,
单位是字节
strlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
不关注内存中存放什么数据
关注内存中是否有 \0 , 如果没有 \0 ,就会持续往后找,可能会越界

三、举例说明

#include <stdio.h>
#include <string.h>
int main() {char str[] = "Hello, World!";// sizeof 返回的是整个数组的大小,包括结尾的空字符和可能的额外空间size_t size_of_str = sizeof(str);// strlen 返回的是字符串中字符的数量,不包括结尾的空字符size_t length_of_str = strlen(str);printf("sizeof(str) = %zu\n", size_of_str);  // 通常会输出 13printf("strlen(str) = %zu\n", length_of_str);  // 输出 12return 0;
}

在这个例子中,sizeof(str) 的返回值是 13,因为 “Hello, World!” 加上一个空字符 \0 一共是 13 个字符(每个字符占用 1 个字节),而 strlen(str) 的返回值是 12,因为它只计算了 “Hello, World!” 中非空字符的数量。

总结 

sizeof和strlen虽然都与字符串有关,但它们的用途和实现原理有很大差异。sizeof用于获取数据类型或变量在内存中所占的字节数,而strlen用于计算字符串的实际长度。在实际编程过程中,应根据具体需求选择合适的函数。希望大家通过本文的介绍,能更好地理解和使用这两个函数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 麒麟V10安装nginx、mysql报错缺少包:error while loading shared libraries libssl.so.10
  • Sparksql常用的json相关函数
  • PostgreSQL 中如何处理数据的唯一性约束?
  • JVM 21 的优化指南:如何进行JVM调优,JVM调优参数有哪些
  • 标签嵌套规则/行内元素/块元素的使用
  • 算法通关:006_1二分查找
  • 设计模式简述(一)
  • 【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动
  • Java实战中如何使用多线程(线程池)及其为什么使用?
  • 科技引领水资源管理新篇章:深入剖析智慧水利解决方案,展现其在提升水资源利用效率、优化水环境管理方面的创新实践
  • 理解 Objective-C 中 `+load` 方法的执行顺序
  • 【大模型基础】4.1 数据挖掘(待)
  • Xubuntu22.04 终端命令调用图形设置工具
  • 化腐朽为神奇!揭开ISP图像处理的神秘面纱,基于瑞芯微RK3568J工业平台!
  • Domainim:一款高效的企业级网络安全扫描工具
  • $translatePartialLoader加载失败及解决方式
  • [Vue CLI 3] 配置解析之 css.extract
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP 简介
  • js对象的深浅拷贝
  • MySQL几个简单SQL的优化
  • scrapy学习之路4(itemloder的使用)
  • Vue学习第二天
  • Webpack 4x 之路 ( 四 )
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 简单易用的leetcode开发测试工具(npm)
  • 聊聊flink的TableFactory
  • 聊一聊前端的监控
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 中文输入法与React文本输入框的问题与解决方案
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #{}和${}的区别?
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (23)Linux的软硬连接
  • (3)选择元素——(17)练习(Exercises)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (poj1.3.2)1791(构造法模拟)
  • (苍穹外卖)day03菜品管理
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (离散数学)逻辑连接词
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (七)Java对象在Hibernate持久化层的状态
  • (全注解开发)学习Spring-MVC的第三天
  • (十五)使用Nexus创建Maven私服
  • (转)德国人的记事本
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core + vue 搭建前后端分离的框架