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

使用sizeof()和strlen()去计算【数组】和【指针】的大小

文章目录

  • 一、知识回顾
    • 1、回顾sizeof()、strlen的作用:
    • 2、数组和指针
    • 3、数组名
  • 二、sizeof()、strlen()的使用区别
    • 1、注意区别:
    • 2、一维数组与一级指针
    • 3、二维数组与二级指针
  • 三、总结回顾

一、知识回顾

1、回顾sizeof()、strlen的作用:

  • sizeof()是用来求取 变量 或者 类型 所占内存空间的大小(单位:字节)。
  • sizeof计算的是占用内存空间的大小,单位是字节,不关注内存中到底存放的是什么。sizeof不是函数,是操作符
  • strlen()是一个库函数是专门用来计算 字符串 长度的,在对其进行调用前是需要包含头文件<string.h>。
  • strlen()函数是通过字符串结束标志 \0 来计算字符串长度的,但计算出来的字符串长度是不包括 \0 的,也就是说所谓的长度就是 \0 前字符的个数。strlen是函数

sizeof是一个运算符,用于计算一个变量或数据类型所占的字节数,不论变量中存储的数据是否为空。而strlen是一个函数,用于计算一个字符串中的字符数,不包括字符串末尾的空字符’\0’。
另外,sizeof可以用于计算任意数据类型的大小,包括基本数据类型和自定义数据类型。
而strlen只能用于计算字符串的长度。
因此,sizeof通常用于确定数组所占的存储空间,而strlen用于确定字符串的长度。

2、数组和指针

  • 数组 - 能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型。
  • 指针就是地址,大小都是4/8。(32位机器是4字节,64位机器是8字节)

3、数组名

  • 大部分情况下数组名是首元素地址
  • 2个例外
    sizeof(数组名) —— 数组名表示整个数组,计算的是整个数组的大小。(看数组名是否是单独放在sizeof()里面)
    &数组名 ————-数组名表示整个数组,取出的是数组的地址

二、sizeof()、strlen()的使用区别

1、注意区别:

  • 字符数组 - char arr1[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’} ->[a,b,c,d,e,f]
  • 字符串数组 - char arr2[]=“abcdef” ->[a,b,c,d,e,f,/0]

  • sizeof()计算的是占用内存空间的大小,单位是字节,不关注内存中到底存放的是什么
  • strlen()是针对字符串的,求的是字符串的长度,本质上统计的是/0之前出现的字符个数。

2、一维数组与一级指针


整型数组

	int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a[1]));//4printf("%d\n", sizeof(a));//16 //sizeof(a) 就是数组名单独放在sizeof内部 计算的是整个数组的大小。printf("%d\n", sizeof(a + 0));// 4/8//a + 0   a不是单独放在sizeof()里面,则是数组首元素的地址,sizeof则是计算数组首元素地址的大小printf("%d\n", sizeof(*a));//4//a不是单独放在sizeof()里面,则是数组首元素的地址 *a == a[0],sizeof()则是计算首元素的大小。//*a -> *&a[0] -> a[0]printf("%d\n", sizeof(a + 1));// 4/8//a不是单独放在sizeof()里面,则是数组首元素的地址 -- int*//a+1 跳过1个整型,是第二个元素的地址 sizeof()是计算第二个元素地址的大小。printf("%d\n", sizeof(&a));// /4/8//&a - 取出的是数组的地址,但是数组的地址也是地址,地址的的大小就是4/8。//int (*pa)[4] = &a;printf("%d\n", sizeof(*&a));//16//等于sizeof(a)printf("%d\n", sizeof(&a+1));// 4/8//&a --> int (*)[4],取出的是数组的地址。//&a + 1 则要跳过一个数组。printf("%d\n", sizeof(&a[0]));//取出首元素地址,sizeof计算的是元素的地址4/8printf("%d\n", sizeof(&a[0]+1));//4/8//取出的是第二个元素的地址,sizeof()计算的是地址的大小。

编译器调试结果:
在这里插入图片描述


字符数组

	char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));//6printf("%d\n", sizeof(arr + 0));// 4/8//arr不单独放在sizeof里面,是数组首元素的地址 ,计算的大小为4/8printf("%d\n", sizeof(*arr));//1//arr不单独放在sizeof里面,arr是首元素地址,*arr 是首元素,大小为1printf("%d\n", sizeof(arr[1]));//元素'b'printf("%d\n", sizeof(&arr));// 4/8//&arr 是数组的地址,地址的大小的都是 4/8printf("%d\n", sizeof(&arr + 1));//4/8printf("%d\n", sizeof(&arr[0] + 1));//4/8//*****************************************printf("%d\n", strlen(arr));//随机值//arr数组首元素地址,找不到‘\0’,所以是计算的大小是随机值printf("%d\n", strlen(arr + 0));//随机值,同上printf("%d\n", strlen(*arr));//非法访问//strlen传入char*(地址)//*arr = 'a'——>(97)被当成地址,非法访问printf("%d\n", strlen(arr[1]));//非法访问,同上printf("%d\n", strlen(&arr));//随机值//找不到/0printf("%d\n", strlen(&arr + 1));//随机值 - 6printf("%d\n", strlen(&arr[0] + 0));//随机值 - 1

形成野指针非法访问
在编译器上调试可见,strlen接受的是char*类型,否则会报错
在这里插入图片描述


字符串数组

	char arr[]="abcdef";//[a b c d e f /0]printf("%d\n",sizeof(arr));//整个数组大小 7printf("%d\n",sizeof(arr+0));//首元素地址大小 4/8printf("%d\n",sizeof(*arr));//首元素大小 1//*arr = arr[0] = *(arr+0)printf("%d\n",sizeof(arr[1]));//1printf("%d\n",sizeof(&arr));//数组的地址,大小 4/8printf("%d\n",sizeof(&arr+1));//+1 跳过一个数组的地址,大小 4/8printf("%d\n",sizeof(&arr[0]+1));//+1 跳过一个元素的地址,大小 4/8//******************************************************************printf("%d\n",strlen(arr));//arr表示首元素地址,计算得到数组大小为 6printf("%d\n",strlen(arr+0));//6,同上printf("%d\n",strlen(*arr));//非法访问printf("%d\n",strlen(arr[1]));//非法访问//strlen是传入char*地址,*arr和arr[1]是数组的元素,传给strlen会被当做地址,造成非法访问printf("%d\n",strlen(&arr));//&arr表示整个数组的大小,6printf("%d\n",strlen(&arr+1));//数组的地址 +1后就找不到 /0 ,大小为随机值printf("%d\n",strlen(&arr[0]+1));//从第二个元素开始算,大小为5

指针

	char* p="abcdef";printf("%d\n",sizeof(p));//4/8//指针变量p 存放着的是地址,所以大小为4/8printf("%d\n",sizeof(p+1));//字符’b‘的地址,大小为4/8printf("%d\n",sizeof(*p));//解引用的一个char类型元素,大小为1printf("%d\n",sizeof(p[0]));//1//p[0] = *(p+0)printf("%d\n",sizeof(&p));//4/8printf("%d\n",sizeof(&p+1));//+1跳过一个char*地址,还是地址,大小还是4/8//********************************************printf("%d\n",strlen(p));//大小为 6printf("%d\n",strlen(p+1));//p+1是'b'的地址,从'b'开始算,大小为5printf("%d\n",strlen(*p));//*p为'a',不是地址,非法访问printf("%d\n",strlen(&p));//随机值//&p取的是变量p的地址,不是p里面存放的地址,所以无法找打字符串printf("%d\n",strlen(&p+1));//随机值,同上printf("%d\n",strlen(&p[0]+1));//大小为 5//p[0]是’a‘,&p[0]去'a'的地址,+1的'b'的地址,从'b'开始计算

3、二维数组与二级指针

整型数组

	int a[3][4]={0};//三行四列的数组printf("%d\n",sizeof(a));//4*3*4=48//a这个数组名单独放在sizeof里面,表示整个数组,计算的是整个数组的大小printf("%d\n",sizeof(a[0][0]));//第一行第一个元素,大小4字节printf("%d\n",sizeof(a[0]));//16//a[0] 是第一行的数组名,这是数组名单独放在sizeof内部,计算的是第一行数组的大小printf("%d\n",sizeof(a[0]+1));//4/8//a[0]不是单独放在sizeof内部,表示的是首元素的地址。即第一行第一个元素的地址,相当于&a[0][0]//a[0]+1 是第一行第二个元素的地址,相当于&a[0][1]printf("%d\n",sizeof(a+1));//4/8//a作为二维数组的数组名,并非单独放在sizeof内部,所以表示首元素是地址//二维数组的首元素是第一行,这里的a就是第一行的地址//a+1是跳过第一行,指向第二行printf("%d\n",sizeof(*(a+1)));//16//*(a+1) -> a[1],计算的是第二行的大小printf("%d\n",sizeof(&a[0]+1));//4/8//&a[0]是第一行的地址//&a[0]+1是第二行的地址printf("%d\n",sizeof(*(&a[0]+1)));//表示第二行,大小为16printf("%d\n",sizeof(*a));//16//*a --> *(a+0)表示第一行,大小为16

三、总结回顾

  • sizeof(数组名),这里的数组名表示整个数组,计算的是数组的大小。
  • &数组名,这里的数组名表示整数数组,取出的是整个数组的地址。
  • 除此之外所有的数组名都表示首元素的地址。

相关文章:

使用sizeof()和strlen()去计算【数组】和【指针】的大小

文章目录 一、知识回顾1、回顾sizeof()、strlen的作用&#xff1a;2、数组和指针3、数组名 二、sizeof()、strlen()的使用区别1、注意区别&#xff1a;2、一维数组与一级指针3、二维数组与二级指针 三、总结回顾 一、知识回顾 1、回顾sizeof()、strlen的作用&#xff1a; siz…...

viple进阶4:打印空心三角形

题目&#xff1a;根据用户输入的行数n打印空心三角形&#xff0c;下图分别为n3、n4、n5和n10的效果图 第一步&#xff1a;观察效果图 输入的行数为3&#xff0c;打印结果就有3行&#xff1b;输入的行数为4&#xff0c;则打印结果就有4行&#xff1b;以此类推&#xff0c;输入的…...

Oauth2.0的内容

OAuth 2.0是一个授权协议&#xff0c;用于允许第三方应用程序访问用户在另一个应用程序上存储的受保护资源&#xff0c;而不需要将用户名或密码公开给第三方应用程序。 OAuth2.0基于客户端-服务器模型&#xff0c;通常需要三个主体&#xff1a;客户端、资源所有者和授权服务器…...

npm 下载包失败解决方案

1.【问题描述】使用 npm 下载vue项目依赖包时失败&#xff0c;版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令&#xff0c;用于在 Node.js 环境中使用 npm&#xff08;Node Package Manager&#xff09;安装包或模块。–force 参数表…...

C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍

文章目录 插入排序希尔排序冒泡排序选择排序快速排序 本文主要介绍用C语言实现的一些排序方法&#xff0c;有插入排序、希尔排序、冒泡排序、选择排序和快速排序&#xff0c;文章中给出的例子都是按照升序排列的。 插入排序 若数组只有一个元素&#xff0c;自然不用排序&#…...

撸视频号收益这个副业靠谱吗?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 昨天有个人问我说做视频号能月入过万吗? 我的回复是&#xff1a;99%的人不能。 但为什么会经常有人这么问呢&#xff0c;松松思考了一下&#xff0c;原因是最近很多人在晒视频号撸收益的项目&am…...

2、数组、Map+HashMap、Set+Hashset、Char和Character类、String类和Char类、Math类

数组 \\一个普通的长度为1的整数数组 Integer[] arr new Integer[1];\\一个普通长度为1的同时元素初始化为1的整数数组。 Integer[] arr new Integer[]{1};\\一个长度为0的空数组 Integer[] arr new Integer[0];Map 常见方法 void clear( ) 从此映射中移除所有映射关系&#…...

ESP8266 WiFi模块快速入门指南

ESP8266是一种低成本、小巧而功能强大的WiFi模块&#xff0c;非常适合于物联网和嵌入式系统应用。本指南将为您提供关于ESP8266 WiFi模块的快速入门步骤和基本知识。 第一步&#xff1a;硬件准备 首先&#xff0c;您需要将ESP8266 WiFi模块与您的开发板连接。通常情况下&#…...

微信小程序将后端返回的图片文件流解析显示到页面

说明 由于请求接口后端返回的图片格式不是一个完整的url,也不是其他直接能显示的图片格式&#xff0c;是一张图片 后端根据模板与二维码生成图片,返回二进制数据 返回为文件流的格式,用wx.request请求的时候&#xff0c;就自动解码成为了下面这样的数据数据格式,这样的数据没…...

网络基础(1)

目录&#xff1a; 1.了解局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09; 2.认识“协议” 3.浅谈OSI七层模型 4.网络传输的基本流程 5.路由器这个设备 ---------------------------------------------------------------------------------------…...

flink的AggregateFunction,merge方法作用范围

背景 AggregateFunction接口是我们经常用的窗口聚合函数&#xff0c;其中有一个merge方法&#xff0c;我们一般情况下也是实现了的&#xff0c;但是你知道吗&#xff0c;其实这个方法只有在你使用会话窗口需要进行窗口合并的时候才需要实现 AggregateFunction.merge方法调用时…...

Day25力扣打卡

打卡记录 寻找旋转排序数组中的最小值&#xff08;二分&#xff09; 链接 由于是旋转排序数组&#xff0c;所以整个数组有两部分是递增的&#xff0c;选取右侧最后元素&#xff0c;即可将整个数组分为大于该元素和小于该元素&#xff0c;碰头地段即为最小值。 class Solutio…...

SpringCloud - OpenFeign 参数传递和响应处理(全网最详细)

目录 一、OpenFeign 参数传递和响应处理 1.1、feign 客户端参数传递 1.1.1、零散类型参数传递 1. 例如 querystring 方式传参 2. 例如路径方式传参 1.1.2、对象参数传递 1. 对象参数传递案例 1.1.3、数组参数传递 1. 数组传参案例 1.1.4、集合类型的参数传递&#xf…...

Postgresql数据类型-布尔类型

前面介绍了PostgreSQL支持的数字类型、字符类型、时间日期类型&#xff0c;这些数据类型是关系型数据库的常规数据类型&#xff0c;此外PostgreSQL还支持很多非常规数据类型&#xff0c;比如布尔类型、网络地址类型、数组类型、范围类型、json/jsonb类型等&#xff0c;从这一节…...

SPASS-交叉表分析

导入数据 修改变量测量类型 分析->描述统计->交叉表 表中显示行、列变量通过卡方检验给出的独立性检验结果。共使用了三种检验方法。上表各种检验方法显著水平sig.都远远小于0.05,所以有理由拒绝实验准备与评价结果是独立的假设&#xff0c;即认为实验准备这个评价指标是…...

用Python的requests库来模拟爬取地图商铺信息

由于谷歌地图抓取商铺信息涉及到API使用和反爬虫策略&#xff0c;直接爬取可能会遇到限制。但是&#xff0c;我们可以使用Python的requests库来模拟爬取某个网页&#xff0c;然后通过正则表达式或其他文本处理方法来提取商铺信息。以下是一个简单的示例&#xff1a; # 导入requ…...

使用EvoMap/Three.js模拟无人机灯光秀

一、创建地图对象 首先我们需要创建一个EM.Map对象&#xff0c;该对象代表了一个地图实例&#xff0c;并设置id为"map"的文档元素作为地图的容器。 let map new EM.Map("map",{zoom:22.14,center:[8.02528, -29.27638, 0],pitch:71.507,roll:2.01,maxPit…...

11.9存储器实验总结(单ram,双ram,FIFO)

实验设计 单端口RAM实现 双端口RAM实现 FIFO实现 文件结构为...

linux(ubuntu)安装并使用scrcpy

scrcpy 是一款开源的在计算机上显示和控制 Android 设备的工具。要在 Ubuntu 上使用 scrcpy&#xff0c;你可以按照以下步骤进行安装&#xff1a; 通过命令行安装 scrcpy&#xff1a; 安装 scrcpy&#xff1a; 打开终端&#xff08;Terminal&#xff09;并执行以下命令来安装…...

linux rsyslog安装配置

syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/rsyslog.conf文件。syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定一个存放地点。syslog使用UDP 514/TCP 514端口。 1.环境信息 环境信息 HostnameIpAddressOS versionModuleNoterh…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...