C语言——sizeof与strlen的对比

一.sizeof 

 我们在学习操作符的时候,就了解到了sizeof操作符,它的作用是求参数所占内存空间的大小,单位是字节。如果参数是一个类型,那就返回参数所占的字节数。

#include <stdio.h>int main()
{int a = 10;size_t b = sizeof(a);//a的类型是int型,在内存中占四个字节,所以结果为4size_t c = sizeof(int);//int类型的数据在内存中占四个字节,所以结果也是4printf("%d %d\n", b, c);
}

我们可以像上面代码一样来计算变量或者一个类型的大小。当然,sizeof()的参数还可以是表达式,但是当表达式作为参数时,表达式是不进行计算的,sizeof只会推断表达式结果的类型,并不会真实计算。

#include <stdio.h>int main()
{int a = 10;int b = 1;size_t c = sizeof(a = a + b);//sizeof()不会计算参数内的表达式,只会推断表达式结果的类型//故打印结果为: a = 10 4printf("a = %d %zd\n", a, c);return 0;
}

当我们使用sizeof操作符的时候,接受返回值的参数最好定义成size_t类型的,打印时用%zd打印。因为sizeof求得是参数在内存中所占的大小,那肯定不可能是负数,所以我们最好用无符号数来接收。size_t表示无符号整型,%zd用来打印无符号整型。

二.sizeof的特殊情况

当sizeof()内的参数为数组名的时候,sizeof求的是整个数组的大小,就不再是类型的大小了。

#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };size_t a = sizeof(arr);//当sizeof()的参数为数组名的时候,求的就是整个数组的大小,单位为字节。size_t b = sizeof(arr[0]);//当sizeof()的参数为数组中的一个元素的时候,求得就是该元素类型的大小。//arr有10个元素,每个元素四个字节,所以a 的值就是4*10 = 40printf("%zd %zd\n", a, b);return 0;
}

我们知道了这个之后,就可以利用这个特殊点来求数组元素的个数。我们只需要将数组的大小除以一个元素的大小就可以得到数组的元素个数啦!

#include <stdio.h>//利用sizeof遇到数组名的特殊,可以求数组的长度
int main()
{int nums[] = { 1,2,4,2,5,6,76,3,7543,55,3534,32 };size_t numsSize = sizeof(nums) / sizeof(nums[0]);printf("%zd\n", numsSize);return 0;
}

三.strlen

strlen是C语言中的一个库函数,头文件为<string.h>,strlen是用来求字符串长度的。它的运行逻辑为:传给它一个字符串地址,它就从这个位置开始往后数,直到遇到'\0'停止,所以,strlen就是统计从起始位置到’\0‘之间的字符个数。

#include <stdio.h>
#include <string.h>//strlen(),求从传过去的字符串地址开始,向后开始数,知道遇到第一个'\0'后停止,统计遇到的字符个数
//使用strlen函数要包含头文件<string.h>
int main()
{char string[] = "abcdef";size_t len = strlen(string);printf("%zd\n", len);return 0;
}

我们知道了strlen函数是统计起始位置到’\0‘之间的字符个数,所以所传字符串内部必须包含’\0‘。

#include <stdio.h>
#include <string.h>int main()
{char string1[] = { 'w','o','r','l','d' };//1char string2[] = "world";//2size_t len1 = strlen(string1);size_t len2 = strlen(string2);printf("%zd %zd\n", len1,len2);return 0;
}

当我们以方式1的形式定义字符串的时候,需要我们自己在结尾加上’\0‘,否则该字符串就无’\0‘,此时如果直接将地址传给strlen函数,strlen在统计’d'之后没有遇到’\0‘,所以不会停止,会继续往后统计,直到遇到’\0‘,所以此时打印len1,结果为随机值。

而当我们以方法二定义字符串的时候,编译器会自动给字符串末尾添加’\0‘,所以不需要自己添加,strlen对其求值时就能正常得出字符串的长度。

上述代码结果为:

如果我们在字符串中添加’\0‘,strlen就会提前停止。

四.sizeof与strlen的对比

sizeofstrlen
1.sizeof是操作符1.strlen是库函数,使用strlen函数要包含头文件<string.h>
2.sizeof计算参数所占内存空间的大小,单位是字节2.strlen求字符串长度,统计从起始位置到'\0'之间的字符个数
3.sizeof不会计算括号内的表达式,只会推断表达式结果的类型3.strlen所计算的字符串必须包含'\0',否则会继续往后找,造成越界,其结果为随机值

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库基本操作(增删改查)与用户授权

前言 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系数据库系统的语言。SQL的设计目标是提供一种简单、直观的语言&#xff0c;使得用户可以通过编写SQL语句来处理他们想要的数据和操作。 目录 一、结构介绍 1. 查看信…

202基于matlab的曲柄滑块机构的运动学仿真分析

基于matlab的曲柄滑块机构的运动学仿真分析&#xff0c;分析各个杆的速度、位移、加速度曲线&#xff0c;以及曲柄滑块机构的动画。程序已调通&#xff0c;可直接运行。 202 matlab 曲柄滑块机构 运动学仿真分析 - 小红书 (xiaohongshu.com)

Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程

文章目录 Windows/Linux-openEuler系统使用路由侠内网穿透&#xff0c;部署项目详细教程一、在windows系统下载安装路由侠并实现项目部署1、下载路由侠并注册安装到Windows系统2、点击内网映射&#xff0c;添加映射&#xff0c;注册域名前缀3、选择网站应用4、配置你想要代理项…

macOS访问samba文件夹的正确姿势,在哪里更改“macOS的连接身份“?还真不好找!

环境&#xff1a;路由器上需要身份认证的Mini NAS macOS Sonoma 14 这是一个非常简单的问题&#xff0c;但解决方法却藏得比较深&#xff0c;不够直观&#xff0c;GPT也没有给出明确的解决提示&#xff0c;特意记录一下。 macOS很多地方都很自动&#xff0c;有时候让人找不到设…

day04_JDBC_课后练习(创建数据库,表格,添加模拟数据,搭建开发环境,编写实体类,实现接口,测试)

文章目录 day04_JDBC_课后练习1、创建数据库2、创建如下表格3、添加模拟数据4、搭建开发环境&#xff0c;准备各个工具组件&#xff08;1&#xff09;使用druid&#xff08;德鲁伊&#xff09;数据库连接池&#xff08;2&#xff09;使用尚硅谷的JDBCTools工具类&#xff08;直…

StarRocks 助力金融营销数字化进化之路

作者&#xff1a;平安银行 数据资产中心数据及 AI 平台团队负责人 廖晓格 平安银行五位一体&#xff0c;做零售金融的领先银行&#xff0c;五位一体是由开放银行、AI 银行、远程银行、线下银行、综合化银行协同构建的数据化、智能化的零售客户经营模式&#xff0c;这套模式以数…

Unity构建详解(3)——SBP的依赖计算

【前置知识】 先要搞清楚Asset和Object的关系&#xff0c;可以简单理解为一个Asset对应多个Object。 unity自定义的Asset也要有一个存储的标准&#xff0c;其采用的是YAML&#xff0c;我们看到的所有Unity自定义的Asset格式&#xff0c;例如.prefab&#xff08;预制体&#x…

解决长尾问题,BEV-CLIP:自动驾驶中复杂场景的多模态BEV检索方法

解决长尾问题&#xff0c;BEV-CLIP&#xff1a;自动驾驶中复杂场景的多模态BEV检索方法 理想汽车的工作&#xff0c;原文&#xff0c;BEV-CLIP: Multi-modal BEV Retrieval Methodology for Complex Scene in Autonomous Driving 链接&#xff1a;https://arxiv.org/pdf/2401.…

【数据结构】快速排序(用递归)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解快速排序&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 基本思想二. 快速排序2.1 hoare版本2.2 挖坑法2.3 前后指针法2.4 快速排序优化三数取中法…

Python学习(一)

Python环境下载安装 安装略 验证安装结果与编写第一个Python程序

Vue 实现带拖动功能的时间轴

1.效果图 2. 当使用timeline-slider-vue组件时&#xff0c;你可以设置以下属性&#xff1a; date&#xff1a;用于设置时间轴滑块的初始日期&#xff0c;格式通常为 YYYY-MM-DD。 mask&#xff1a;一个布尔值&#xff0c;用于控制是否显示背景遮罩。 markDate&#xff1a;一…

需求:实现一个类似打印的效果(文字一个字一个字的输出)

实现效果&#xff1a; 需求&#xff1a;最近接到这么一个需求&#xff0c;ai机器人回复的问题&#xff0c;后端是通过websocket每隔一段事件返回数据&#xff0c;前端拿到数据后直接渲染&#xff0c;现在需要做到一个效果&#xff0c;后端返回的结果前端需要一个一个文字的输出…

MultiArch与Ubuntu/Debian 的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;基于ARM 的Linux系统的交叉编译 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告&#xff1a; 本教程可能包含过时的信息。 什么是“MultiArch” OpenCV 可能…

【Canvas与艺术】暗蓝网格汽车速度仪表盘

【关键点】 采用线性渐变色&#xff0c;使上深下浅的圆有凹下效果&#xff0c;使上浅下深的圆有凸起效果&#xff0c;两者结合就有立体圆钮的感觉。 【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type&quo…

php搭建websocket

1.项目终端执行命令&#xff1a;composer require topthink/think-worker 2.0.x 2.config多出三个配置文件&#xff1a; 3.当使用php think worker:gateway命令时&#xff0c;提示不支持Windows。 4.打包项目为zip格式 5.打包数据库 6.阿里云创建记录 7.宝塔面板新增站点…

win10如何录制视频?解锁屏幕录制新姿势!

在Windows 10操作系统中&#xff0c;视频录制已经成为一项非常实用的功能。无论是进行在线教育、游戏直播&#xff0c;还是制作教学视频、会议记录&#xff0c;一款易于使用且功能强大的录屏软件都是必不可少的。在本文中&#xff0c;我们将向您介绍win10如何录制视频的三种方法…

一枝独秀,基于区块链共益型短视频平台享视,真的能抗衡各大短视频平台吗

早在2006年&#xff0c;全球非营利性组织共益实验室(B Lab)就提出了共益企业(B Corp)的概念&#xff0c;致力于推动商业向善。 但时至今日&#xff0c;共益企业发展仍处初级阶段&#xff0c;而且只强调要对社区、员工、环境、供应商、消费者等利益相关者负责&#xff0c;认定标…

【协议-HTTPS】

https https是在http协议的基础上&#xff0c;添加了SSL/TLS握手以及数据加密传输&#xff0c;也属于应用层协议。 httpshttp加密认证完整性保护 https交互图&#xff1a; HTTPS的整体过程分为证书验证和数据传输阶段&#xff1a; ① 证书验证阶段 浏览器发起 HTTPS 请求 服务…

电脑不能读取移动硬盘,但是可以读取U盘解决方法

找到此电脑 右键设备管理器&#xff0c;找到其中的通用串行总线控制器。 注意&#xff0c;凡是插入到电脑当中不能读取的U盘或者移动硬盘&#xff0c;都会在通用串行总线控制器当中显示为USB大容量存储设备 鼠标选中“USB大容量存储设备”&#xff0c;右键卸载它。此时&#x…

【算法每日一练]-动态规划(保姆级教程 篇17 状态压缩)#POJ1185:炮兵阵地 #互不侵犯

目录 今日知识点&#xff1a; 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1和i-2行进行不断转移 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1行进行状态匹配&#xff0c;然后枚举国王数转移 POJ1185&#xff1a;炮兵阵地 思路&#xff1a; 题目&#xff1a;互…