C语言——sizeof与strlen的对比

一.sizeof 

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

#include <stdio.h>

int main()
{
	int a = 10;
	size_t b = sizeof(a);//a的类型是int型,在内存中占四个字节,所以结果为4
	size_t c = sizeof(int);//int类型的数据在内存中占四个字节,所以结果也是4
	printf("%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 4
	printf("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 = 40
	printf("%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' };//1
	char string2[] = "world";//2
	size_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',否则会继续往后找,造成越界,其结果为随机值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习300问】48、如何绘制ROC曲线?

ROC曲线&#xff08;受试者工作特征曲线&#xff09;是一种用于可视化评估二分类模型性能的指标。特别是在不同阈值情况下模型对正类和负类的区分能力。那么“阈值”到底是个什么呢&#xff1f;ROC曲线中的每一个点到底是什么意思&#xff1f; 一、ROC曲线的绘制【理论】 二分…

LeetCode Python - 72. 编辑距离

目录 题目描述解法运行结果 题目描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 “h…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢&#xff1f;2.人为什么要发明工具&#xff0c;进行进化呢&#xff1f;3.人是如何发明工具的&#xff1f;4.为什么要有不同的岗位和行业&#xff1f; 二、计算机(操作系统)发展的基本脉络1.第一台计算…

Google ScreenAI代表了一款先进的视觉语言模型,专为用户界面(UI)和视觉情境下的语言理解而设计

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

二次开发Flink-coGroup算子支持迟到数据通过测输出流提取

1.背景 coGroup算子开窗到时间关闭之后&#xff0c;迟到数据无法通过测输出流提取&#xff0c;intervalJoin算子提供了api&#xff0c;因为join算子底层就是coGroup算子&#xff0c;所以Join算子也不行。 flink版本 v1.17.1 2.coGroup算子源码分析 2.1完成的coGroup算子调用流…

QT(C++)-error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”

1、项目场景&#xff1a; 在VS中采用QT&#xff08;C&#xff09;调试时&#xff0c;出现error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”错误 2、解决方案&#xff1a; 在“解决方案资源管理器”中选中出现此类BUG的项目&#xff0c;右键-…

jenkins介绍,帮助你从安装到使用jenkins

Jenkins 概述 官网地址&#xff1a;https://www.jenkins.io/zh/ 什么是 Jenkins Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件。它提供了一个易于使用的图形化界面&#xff0c;可以通过配置简单的任务来实现自动化构…

javaSSM游泳馆日常管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM游泳馆日常管理系统是一套完善的完整企业内部系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;MAVEN方式加载&#xff0c;系统具有完整的源代码和…

Vue 3 里的 onMounted 怎么用?

疑问 最近&#xff0c;一直在学习 Vue 3&#xff0c;此前我不懂前端&#xff0c;也没写过 Vue 2&#xff0c;所以是从 0 开始学习 Vue 3 的。很多对普通人不是疑问的&#xff0c;在我这里也会不太清楚。 我在写项目的时候&#xff0c;常见的一种场景是这样的&#xff1a;页面…

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序设计参考…

基于SSM非遗视域下喀什旅游网站

ssm非遗视域下喀什旅游网站的设计与实现 摘要 我们的生活水平正在不断的提高&#xff0c;然而提高的一个重要的侧面表现就是更加注重我们的娱乐生活。旅行是我们都喜欢的一种娱乐方式&#xff0c;各式各样的旅行经历给我们带来的喜悦也是大不相同的。带来快乐的同时也因为其复…

IntelliJ IDE 插件开发 | (七)PSI 入门及实战(实现 MyBatis 插件的跳转功能)

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

MongoDB高可用架构涉及常用功能整理

MongoDB高可用架构涉及常用功能整理 1. mongo架构和相关组件1.1. Master-Slave主从模式1.2. Replica Set 副本集模式1.3. Sharding 分片模式 2. Sharding 分片模式2.1. Hashed Sharding方式2.2. Range Sharding方式 3. 事务性4. 疑问和思考4.1. 怎么保证数据的高可靠&#xff1…

常用中间件redis,kafka及其测试方法

常用消息中间件及其测试方法 一、中间件的使用场景引入中间件的目的一般有两个&#xff1a;1、提升性能常用的中间件&#xff1a;1) 高速缓存&#xff1a;redis2) 全文检索&#xff1a;ES3) 存日志&#xff1a;ELK架构4) 流量削峰&#xff1a;kafka 2、提升可用性产品架构中高可…

Web前端—浏览器渲染原理

浏览器渲染原理 浏览器渲染原理渲染时间点渲染流水线1. 解析HTML—Parse HTML2. 样式计算—Recalculate Style3. 布局—Layout4. 分层—Layer5. 绘制—Paint6. 分块—Tiling7. 光栅化—Raster8. 画—Draw完整过程 面试题1. 浏览器是如何渲染页面的&#xff1f;2. 什么是 reflow…

linux apt 速度慢 换源

Ubuntu 20.04.1 LTS已推出,一样的为期5年的服务,感觉不错,安装了一个,但是苦于使用默认源在国内下载太慢,就想着把apt源改为国内源,目前国内比较好的源,有阿里源,清华源,豆瓣源等,下面我以阿里源为例,说下如何修改。 也可以在中科大https://mirrors.ustc.edu.cn/查…

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用&#xff1a;https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后&#xff0c;需要将安装目录添加到环境变…

福昕阅读器 PDF 文档基本操作

福昕阅读器 PDF 文档基本操作 References 转至 PDF 顶部 快捷键&#xff1a;Home. 转至 PDF 顶部 快捷键&#xff1a;End. 打开超链接 文本选择工具 -> 手形工具 (Hand Tool) -> 点击超链接 福昕阅读器 同时在多个窗口中打开多个文件 文件 -> 偏好设置 -> 文…

数据库导入文件或者运行文件的时候报错误 #1046 - No database selected

如果我们在使用数据库导入文件的时候报错误 #1046 - No database selected该怎么解决 那么小编带我们可以从三个角度去观察 1、这种情况一般是因为你在数据库中没有这个数据库&#xff0c;你新建一个你要导入的数据库名字的数据库&#xff0c;然后选中该数据库&#xff0c;再进…

设计模式-初步认识

目录 &#x1f6fb;1.什么是设计模式 &#x1f69a;2.设计模式的优点 &#x1f68d;3.设计模式6大原则 &#x1f6f4;4.设计模式类型 1.什么是设计模式 设计模式代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开…