sizeof和strlen的区别

news2025/2/24 11:10:32

目录

一、 sizeof

二、 strlen 

三、 sizeof 和 strlen的对比


一、 sizeof

在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的大小。

sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。

比如:

#include <stdio.h>
int main()
{
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(int));

	return 0;
}

看结果:

 

我们可以看出这三个的值都是4,如果sizeof求变量的大小可以不加括号,如果是类型就必须加括号。

又比如:

#include <stdio.h>

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof("abcdef"));

	return 0;
}

看结果:

 

此时的结果是7,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,我们可以调试监视一下arr这个数组。

我们可以清楚的看见arr[6] = '\0',故sizeof(arr)= 7。 

二、 strlen 

strlen 是C语⾔库函数,功能是求字符串长度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在越界查找。 

看下面这段代码:

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = { 'a','b','c','d','e','f' };
	char arr2[] = { 'a','b','c','d','e','f','\0' };
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	return 0;
}

结果如下:

 

我们可以看到arr1数组的长度为38,arr2数组的长度为6,为什么呢?同样我们需要探讨两个数组在内存中的存储状况。

 

 arr2数组的存储情况和示例1字符串的存储情况相同,而arr1却不同,所以arr2的长度为6我们就不再赘述,主要研究一下arr1的长度为什么是38。我们都知道字符串的结束标志为”\0",对于arr1数组来说,没有在数组中额外存储”\0",所以编译器在读取时,并不会像我们所期望的那样停止读取,故长度当然不会时6,至于为什么是38,是因为在读取时,编译器读取完arr1时会继续往后读取,直到读取到”\0",arr1在读取完第38个字符后才会遇到”\0";由于每个人的电脑和编译器不同,读取的长度也不一样,所以arr1这种情况一般我们认为它读取的结果为随机值!!!

为了说明”\0"的重要性,我们再举一个例子来说明。

#include <stdio.h>
#include <string.h>

int main()
{

	printf("%d\n", strlen("abc\0def"));

	return 0;
}

 

这里的字符串“abc\0def"读取的结果是3想必不用赘述了吧!!!

我们在看一下上面sizeof的代码 

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof("abcdef"));
	printf("%d\n", strlen("abcdef"));
	return 0;
}

 

sizeof的结果是7,比strlen的结果多1,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,而strlen遇到”\0"就停止了。

三、 sizeof 和 strlen的对比

sizeofstrlen

1. sizeof是操作符

2. sizeof计算操作数所占内存的大小, 单位是字节

3. 不关注内存中存放什么数据

1. strlen是库函数,使⽤需要包含头⽂件 string.h

2.srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1238298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux CentOS7.6安装jenkins(小白版本)

前言 本人是一个前端开发者&#xff0c;由于有时候需要发版自己的东西&#xff0c;所以想搞一个Jenkins玩玩&#xff0c;看了网上好多教程&#xff0c;但是都不是针对小白的&#xff0c;比如linux怎么输入&#xff0c;怎么结束&#xff0c;自己也是搞了好久踩了好多坑 所以记录…

电商领域的三大沉疴难题?实在智能RPA来帮你药到病除!

在电商市场规模迅速扩大的当下&#xff0c;厂家们为了保持自身的竞争力&#xff0c;纷纷走上了数智化转型的道路&#xff0c;明白学会使用自动化利器才是制胜之道。 如今从产业的生产线到运营商、物流运输、商品售前、商品售后&#xff0c;实在RPA在电商平台的应用已经十分广泛…

el-input限制输入整数等分析

文章目录 前言1、在 Vue 中&#xff0c;可以使用以下几种方式来限制 el-input 只能输入整数1.1 设置input 的 type为number1.2 使用inputmode1.3 使用自定义指令1.4 使用计算属性1.5 使用 onafterpaste ,onkeyup1.6 el-input-number 的precision属性 总结 前言 input 限制输入…

[点云分割] 欧式距离分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <chrono>#include <pcl/ModelCoefficients.h> // 模型系数的定义 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/sample_c…

云南旅游攻略思维导图

马上就要2024年春节了&#xff0c;相信小伙伴们都蠢蠢欲动了&#xff0c;春节去哪里玩&#xff1f;今天小P来给大家分享云南旅游攻略了&#xff0c;希望可以对大家有所帮助。 为什么要来云南呢&#xff1f;因为云南的绝大多数地方&#xff0c;一年四季总是那样温暖&#xff1b;…

redis的主从复制,哨兵模式

1.主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用 主从复制实现数据的多机备份&#xff0c;以及读写分离&#xff08;主服务器负责写&#xff0c;从服务器只能读&#xff09; 缺陷&#xff1a…

java springboot测试类鉴定虚拟MVC运行值与预期值是否相同

好 上文java springboot在测试类中构建虚拟MVC环境并发送请求中 我们模拟的MVC环境 发送了一个请求 我们这次需要 对比 预期值和运行值是否一直 这里 我们要用一个 MockMvcResultMatchers 他提供了非常多的校验类型 例如 请求有没有成功 有没有包含请求头信息 等等 这里 我们做…

前端性能优化总结

这里写目录标题 页面性能测试工具测试指标 前端页面性能常见的问题前端页面性能优化常见策略及方案dns优化------预解析域名&#xff08;异步进行&#xff09;http请求优化减少请求次数同时多开持久连接 前面面试url从输入到确认搜索发生了什么js介绍new一个对象的过程&#xf…

智能配电房环境监控系统

智能配电房环境监控系统是一种用于实时监测和控制配电房环境的系统。依托电易云-智慧电力物联网&#xff0c;通过集成应用物联网技术&#xff0c;实现对配电房内环境的全天候状态监视和智能控制。以下是智能配电房环境监控系统的主要功能&#xff1a; 环境数据实时监测&#xf…

Autoware.universe部署06:使用DBC文件进行UDP的CAN通信代码编写

目录标题 一、安装DBC文件编辑工具VectorCANdb二、编写DBC文件2.1 CAN通信协议2.2 编写DBC文件2.2.1 根据CAN协议设置signals2.2.2 设置报文2.2.3 建立节点 三、根据DBC文件编写ROS2驱动程序四、实际通信调试 根据CAN协议编写DBC文件&#xff0c;通过DBC文件编写ROS2包进行UDP通…

Centos7使用rpm安装mysql 5.7.43

Centos7使用rpm安装mysql 5.7.43 1、下载rpm包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar2、解压并安装 tar xf mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar yum -y install mysql-*3、按需修改mysql配置 #注意&a…

【OpenCV实现图像:使用OpenCV进行物体轮廓排序】

文章目录 概要读取图像获取轮廓轮廓排序小结 概要 在图像处理中&#xff0c;经常需要进行与物体轮廓相关的操作&#xff0c;比如计算目标轮廓的周长、面积等。为了获取目标轮廓的信息&#xff0c;通常使用OpenCV的findContours函数。然而&#xff0c;一旦获得轮廓信息后&#…

WCS WMS WES关系

一、定义&#xff1a; 仓库控制系统 &#xff08;WCS&#xff09; 是一种软件应用程序。 WCS用于指导仓库和配送中心&#xff08;DC&#xff09; 内的实时活动。作为仓库/配送中心的“交通警察”&#xff0c;WCS 负责保持一切顺利运行&#xff0c;最大限度地提高物料搬运子系…

Android修行手册-溢出父布局的按钮实现点击

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

《算法通关村——幂运算问题解析》

《算法通关村——幂运算问题解析》 2 的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1…

纽扣电池上架TEMU、亚马逊美国站需要做什么认证?纽扣电池认证标准16CFR1700.15,16CFR1700.20

近日&#xff0c;Temu连发多条卖家弹窗内容均为商品质量事故违规处理通告。其中一条为卖家销售的车载吸尘器发生烧毁、冒烟等情况&#xff0c;产生用户人伤、财损等舆情。经查实是商家偷换关键部件锂电池&#xff0c;导致商品质量下降造成事故。TEMU对于问题车载吸尘器处理结果…

MATLAB实现灰色预测

久违了&#xff0c;前段时间由于学习压力大&#xff0c;就没怎么更新MATLAB相关的内容&#xff0c;今天实在学不进去了&#xff0c;换个内容更新一下~ 本贴介绍灰色预测模型&#xff0c;这也是数学建模竞赛常见算法中的一员&#xff0c;和许多预测模型一样——底层原理是根据已…

win10 eclipse安装教程

前言&#xff1a;安装eclipse之前必须安装JDK&#xff0c;JDK是编译环境&#xff0c;eclipse是集成开发平台。 一、JDK的安装 Java Development Kit 简称 JDK (一). 官方下载地址&#xff1a; Java Archive Downloads - Java SE 8u211 and later (oracle.com) 找到&#xf…

【每日一题】2304. 网格中的最小路径代价-2023.11.22

题目&#xff1a; 2304. 网格中的最小路径代价 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中&#xff0c;从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) …