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.mzph.cn/news/768693.shtml

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

相关文章

Mamba 基础讲解【SSM,LSSL,S4,S5,Mamba】

文章目录 Mamba的提出动机TransformerRNN Mama的提出背景状态空间模型 (The State Space Model, SSM)线性状态空间层 (Linear State-Space Layer, LSSL)结构化序列空间模型 &#xff08;Structured State Spaces for Sequences, S4&#xff09; Mamba的介绍Mamba的特性一&#…

美团2024届秋招笔试第二场编程真题

要么是以0开头 要么以1开头 选择最小的答案累加 import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和…

C# 右键快捷菜单(上下文菜单)的两种实现方式

在C#中&#xff0c;ContextMenuStrip是一种用于创建右键菜单的控件。它提供了一种方便的方式来为特定的控件或窗体添加自定义的上下文菜单选项。有两种实现方式&#xff0c;如下&#xff1a; 一.通过ContextMenuStrip控件实现 1.从工具箱中拖一个ContextMenuStrip控件到窗体上…

LLM - 大语言模型的分布式训练 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136924304 大语言模型的分布式训练是一个复杂的过程&#xff0c;涉及到将大规模的计算任务分散到多个计算节点上。这样做的目的是为了处…

领域、系统和组织-《实现领域驱动设计》中译本评点-第2章(4)

相关链接 DDD领域驱动设计批评文集>> 汪峰哭晕在厕所-《实现领域驱动设计》中译本评点-第2章&#xff08;1&#xff09; 可不是乱打的-《实现领域驱动设计》中译本评点-第2章&#xff08;2&#xff09; “领域”的错误定义-《实现领域驱动设计》中译本评点-第2章&…

Tomcat介绍,Tomcat服务部署

目录 一、Tomcat 介绍 二、Tomcat 核心技术和组件 2.1、Web 容器&#xff1a;完成 Web 服务器的功能 2.2、Servlet 容器&#xff0c;名字为 catalina&#xff0c;用于处理 Servlet 代码 2.3、JSP 容器&#xff1a;用于将 JSP 动态网页翻译成 Servlet 代码 Tomcat 功能组件…

Window全网解析网站下载视频

全网解析网站下载视频 介绍m3u8格式cbox格式 解析视频下载的方法方法一解析视频下载视频 方法二老王浏览器下载使用浏览器解析下载视频 总结 介绍 今天分享一下如何解析网页中的视频进行下载。通常情况下我们打开的某某网站的视频是不提供下载接口的&#xff0c;甚至说你下载了…

ClickHouse--11--物化视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.物化视图什么是物化视图? 1.1 普通视图1.2 物化视图1.3 优缺点1.4 基本语法1.5 在生产环境中创建物化视图1.6 AggregatingMergeTree 表引擎3.1 概念3.2 Aggregat…

面试算法-87-分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …

【JAVA】通过JAVA实现用户界面的登录

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Linux系统——硬件命令

目录 一.网卡带宽 1.查看网卡速率——ethtool 网卡名 2.查看mac地址——ethtool -P 网卡名 二、内存相关 1.显示系统中内存使用情况——free -h 2.显示内存模块的详细信息——dmidecode -t memory 三、CPU相关 1.查看CPU架构信息——lscpu 2.性能模式 四、其他硬件命…

C语言字节对齐关键字#pragma pack(n)的使用

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作&#xff0c;有些是为了加速对内存的访问。因此&#xff0c;学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

牛客NC170 最长不含重复字符的子字符串【高频 中等 map、滑动窗口 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7 思路 用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况&#xff1a;“bacbca”这里的a…

PCB中常用电子器件封装学习——【一网打尽】

‘ 上图是这个世界上大概所有的封装种类&#xff0c;当然我们日常硬件电路设计肯定用不到这么多&#xff0c;接下来我将介绍几种工程上常用的封装&#xff0c;配以图片方便大家理解学习。在电子器件选型的时候&#xff0c;避免选择到一些非常难以焊接的封装电子器件。

使用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;需要将安装目录添加到环境变…

Jenkins的快速入门

文章目录 一、Jenkins是什么&#xff1f;二、Jenkins安装和持续集成环境配置1.持续集成流程说明2.Gitlab代码托管服务器安装Gitlab简介&#xff1a;Gitlab安装Gitlab的使用切换中文添加组创建用户将用户添加到组创建项目idea中代码上传Gitlab 3.Jenkins持续集成环境服务器安装J…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…

通过 Socket 手动实现 HTTP 协议

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

[Python人工智能] 四十四.命名实体识别 (5)利用bert4keras构建Bert-CRF实体识别模型(实体位置)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解如何实现中文命名实体识别研究,构建BiGRU-CRF模型实现。这篇文章将继续以中文语料为主,介绍融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。然而,该代码最终结…

红外遥控器的使用和详细解释

infrared.c #include "infrared.h"/* 红外 --- PA8*/void Infrared_Init(void) {GPIO_InitTypeDef GPIO_InitStruct; EXTI_InitTypeDef EXTI_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;//使能SYSCFG时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, E…