【C语言】“指针类型”与“野指针”
文章目录
- 一、指针是什么❔
- 二、指针和指针类型
- 1.指针+-整数
- 2.指针解引用
- 三.野指针
- 1.引起野指针的原因
- 2.如果避免野指针
- 完结
一、指针是什么❔
指针也就是 内存地址 ,在计算机上我们访问数据需要通过内存地址来访问,在C语言中,指针变量是用来存放内存地址的变量,在不同系统下,指针(内存)地址的长度不同,32位CPU下,由于有32根地址线,所以指针(内存)地址是由32个bit位组成的,也就是4Byte,在64位CPU下,有64根地址线,所以地址由64个bit位组成,也就是8Byte,指针指向的地址都是一个内存单元,一个内存单元里面有1byte的数据。
- 创建第一个指针变量:
#include <stdio.h>int a = 8; //先创建一个变量,此变量在内存中有自己的地址。
int *pa = &a; //&符号取出a的地址,交给pa指针,*符号表示pa是指针类型
*pa = 10; //我们可以通过*pa修改a的值(没有*的话pa是a的地址,*是解引用的意思,加上之后pa代表的就不是a的地址而是a)
printf("%d",*pa); //10

二、指针和指针类型
- 指针是用来存放地址的,那么为什么还分为char* int* short* long*…….?
一般情况下,char**类型的指针是为了存放char类型变量的地址,int类型的指针是为了存放int类型的地址,short类型的指针是为了存放short类型的地址…….但实际上,指针的类型有一下两大作用:
- 指针类型决定了指针进行±整数的时候±的步长(字节)
- 指针类型决定了对指针进行解引用的时候能访问几个字节
1.指针±整数
代码示例:
#include <stdio.h>int main()
{int a = 10;char* char_pa = (char*)&a;short* short_pa = (short*)&a;int* int_pa = (int*)&a;printf("%p\n",&a); //00000071DCEFFC24 %p输出a的的地址printf("%p\n",char_pa); //00000071DCEFFC24 printf("%p\n",char_pa+1); //00000071DCEFFC25 加了一个字节printf("%p\n",short_pa); //00000071DCEFFC24printf("%p\n",short_pa+1); //00000071DCEFFC26 加了两个字节printf("%p\n",int_pa); //00000071DCEFFC24printf("%p\n",int_pa+1); //00000071DCEFFC28 加了四个字节}

可以看到在地址+1之前他们的地址都是与*a一样,进行+1之后,char加了一个字节,short加了两个字节,int加了三个字节,也就是说,指针类型能决定指针±的时候可以±多少个字节,±的字节由类型的长度决定。
2.指针解引用
代码示例
#include <stdio.h>int main()
{int a = 0x11223344;char *char_pa = (char*)&a;short *short_pa = (short*)&a;int *int_pa = &a;printf("%d\n",*char_pa);printf("%d\n",*short_pa);printf("%d\n",*int_pa);}
输出结果

- 明明我们赋值的都是&a,那为什么会造成三个类型解引用都不一样呢?,我们可以用下面代码测试一下,看看内存发生了什么。🧐
int main()
{int a = 0x11223344;char *char_pa = (char*)&a;*char_pa = 0;
}
这是在a没有改动之前

执行*char_pa = 0;

- a的一个字节被置为了0
int main()
{int a = 0x11223344;short *short_pa = (short*)&a;*short_pa = 0;
}
执行*short_pa = 0;

- a的两个字节被置为了0
int main()
{int *int_pa = &a;*int_pa = 0;return 0;
}
执行*int_pa = 0;

- a的四个字节被置为了0
🤓由此,我们可以得出结论,指针类型的第二大作用就是,指针类型决定了对指针解引用时,能访问或修改几个字节,这由数据类型的大小决定
三.野指针
野指针会指向一段实际的内存,但是野指针是指指针指向的位置是不可知的(随机的,不正确的,没有初始化的,没有明确限制的),它指向哪里我们不知道,或者说它指向的空间已经被我们释放,那么他就是一个野指针,在程序中,我们必须要避免野指针的出现。
- 下面是容易出现野指针的场景
1.引起野指针的原因
(1)指针未初始化。
#include <stdio.h>
int main()
{int *p; //指针没有指向明确的地址,那么将是随即地址,也就是野指针*p = 1;
}
(2)指针越界访问
#inlcude <stdio.h>
int main()
{int arr[10] = {0};int *p = arr;for(int i=0;i<13;i++){*(p++) = 8; //当指针超出arr数组的范围时,p就是野指针}
}
(3)指针指向的空间被释放
int main()
{int *p = malloc(10 * sizeof(int));free(p);*p = 10; //指针p指向的内存空间已经被释放,此时的p就是野指针return 0;
}
2.如果避免野指针
(1)指针初始化
(2)小心指针越界
(3)指针指向空间释放即使置NULL
(4)避免返回局部变量的地址
(5)指针使用之前检查有效性
int main()
{int *p = NULL; //使用之前初始化为NULLif(p!=NULL){*p = 10; //使用之前检查有效性 }int *pa = malloc(10 * sizeof(int));//此处省略n行代码free(p);pa ==NULL; //指针用完之后,及时置空。
}
完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐

相关文章:
【C语言】“指针类型”与“野指针”
文章目录一、指针是什么❔二、指针和指针类型1.指针-整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针完结一、指针是什么❔ 指针也就是 内存地址 ,在计算机上我们访问数据需要通过内存地址来访问,在C语言中,指针变量是用来存放…...
Linux:软链接和硬链接的理解
Linux通过命令行创建快捷方式使用的命令是ln,这里就涉及到了软链接和硬链接,确实有些不好理解,如果你也一样,那么可以继续看下去了 目录ln命令语法实操创建软链接:ln -s [源文件或目录][目标文件或目录]创建硬链接&…...
力扣HOT100 (1-5)
目录 1.两数之和 2.两数相加 拓展到牛客的TOP101的BM11( 链表相加(二)) 3.无重复的最长子串(牛客BM92) 解法1: 解法2: 4.寻找两个正序数组的中位数 5.最长回文子串 1.两数之和 思路:用Has…...
车载基础软件——AUTOSAR CP典型应用案例SOME/IP和TSN时间同步
我是穿拖鞋的汉子,魔都中坚持长期主义的一个屌丝工程师! 今天是2023年2月7日,上海还在下着雨,估计是到了梅雨时节(提前到来?),真想说句我劝天公重安排,不让梅雨早时来!!! 老规矩分享一段喜欢的文字,避免自己成为高知识低文化的工科男: “ 我们只需做的,是走好…...
【Linux】操作系统与进程的概念
目录 冯诺依曼体系 注意 为什么CPU不直接访问输入或输出设备? 跨主机间数据的传递 操作系统 管理 进程 描述进程 进程的查看和终止 bash 通过系统调用创建子进程 fork的辨析 冯诺依曼体系 🥖冯诺依曼结构也称普林斯顿结构,是一种将…...
(1分钟突击面试) 高斯牛顿、LM、Dogleg后端优化算法
高斯牛顿法 LM法 DogLeg方法编辑切换为居中添加图片注释,不超过 140 字(可选)知识点:高斯牛顿是线搜索方法 LM方法是信赖域方法。编辑切换为居中添加图片注释,不超过 140 字(可选)这个就是JTJ是…...
d3.js与echarts对比
D3.js 和 ECharts 是两种常用的数据可视化工具,它们有着不同的优缺点: D3.js: 优点: 功能强大,提供了极高的灵活性和定制性,支持多种图表类型,如柱状图、饼图、散点图、树图、网络图等。 可以…...
机器学习之K-means原理详解、公式推导、简单实例(python实现,sklearn调包)
目录1. 聚类原理1.1. 无监督与聚类1.2. K均值算法2. 公式推导2.1. 距离2.2. 最小平方误差3. 实例3.1. python实现3.2. sklearn实现4. 运行(可直接食用)1. 聚类原理 1.1. 无监督与聚类 在这部分我今天主要介绍K均值聚类算法,在这之前我想提一…...
OBS 进阶 一个从自定义对话框中 传参到插件的例子
目录 一、自定义对话框,传参综合例子 1、自定义对话框 1)自定义对话框类...
在Linux和Windows上编译datax-web-ui源码
记录:375场景:在CentOS 7.9操作系统上,使用apache-maven-3.8.7安装编译datax-web-ui源码。在Windows上操作系统上,使用apache-maven-3.8.7编译datax-web-ui源码。版本:JDK 1.8 node-v14.17.3 npm-6.14.13datax-web-ui开…...
React组件生命周期管理
组件生命,就是组件在不同阶段提供对应的钩子函数,来处理逻辑操作。比如初始化阶段,我们需要初始化组件相关的状态和变量。组件销毁阶段时,我们需要把一些数据结构销毁来节约内存。 React组件生命周期 React组件生命周期分为三个阶段:挂载阶段【Mount】、更新阶段【Updat…...
Linux:全志H3图像codec使用笔记
1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 图像 codec 概述 图像编解码器(codec) 包含 Encoder 和 Decoder 两部分功能。我们用下列分别说明 Encoder 和 Decoder 的工作方式。 ----------…...
【Python小游戏】通过这款专为程序员设计的《极限车神》小游戏,你的打字速度可以赢过专业录入员,这个秘密98%的人都不知道哦~(爆赞)
导语 哈喽,我是你们的木木子👸! 今天小编要为大家介绍一款小编自己用代码码出来的赛车风格的打字小游戏 取名暂定为《🚗极限车神🚗》打字小游戏。 这款Pygame小游戏在玩法上可以说十分创新,不仅能游戏还…...
Springboot扩展点之BeanPostProcessor
前言 Springboot(Spring)的扩展点其实有很多,但是都有一个共同点,都是围绕着Bean和BeanFactory(容器)展开的,其实这也很好理解,Spring的核心是控制反转、依赖注入、面向切面编程&…...
Fluent Python 笔记 第 3 章 字典和集合
3.1 泛映射类型 只有可散列 的数据类型才能用作这些映射里的键 字典构造方法: >>> a dict(one1, two2, three3) >>> b {one: 1, two: 2, three: 3} >>> c dict(zip([one, two, three], [1, 2, 3])) >>> d dict([(two, 2…...
大型物流运输管理系统源码 TMS源码
大型物流运输管理系统源码 TMS是一套适用于物流公司的物流运输管理系统,涵盖物流公司内部从订单->提货->运单->配车->点到->预约->签收->回单->代收货款的全链条管理系统。 菜单功能 一、运营管理 1、订单管理:用于客户意向订…...
PCIE总线
PCIE总线记录描述PCI分类与速度PCIE连接拓扑与角色PCIE接口定义PCIE数据传输方式与中断在PCIE中有两种数据传输方式:PCIE中断:PCIE协议栈与工作流程PCIE地址空间分类实例分析PCIE两种访问方式描述 PCI-Express(peripheral component interconnect expre…...
Android IO 框架 Okio 的实现原理,如何检测超时?
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 前言 大家好,我是小彭。 在上一篇文章里,我们聊到了 Square 开源的 I/O 框架 Okio 的三个优势:精简且全面的 API、基于共享的缓冲区设计以…...
简单介绍反射
1.定义Java的反射机制是在运行状态中,对于任意一个类,都知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性,既然能拿到,我们就可以修改部分类型信息;这种动态获取信息的…...
PyTorch学习笔记:nn.MSELoss——MSE损失
PyTorch学习笔记:nn.MSELoss——MSE损失 torch.nn.MSELoss(size_average None,reduce None,reduction mean)功能:创建一个平方误差(MSE)损失函数,又称为L2损失: l(x,y)L{l1,…,lN}T,ln(xn−yn)2l(x,y)L…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
