C语言-【指针三】-【野指针】

news2024/12/30 0:07:09

     我又来了,勤奋博主上线啦,哈哈哈。本篇文章呢,主要简单介绍一下指针中野指针的相关知识。

野指针

那在对它进行深入了解时,先得知道什么叫野指针吧,那什么是野指针呢?

野指针就是:指向的内存地址是未知的,也就是随机的,不正确的,没有明确限制的。

前面我们讲过,指针变量也是变量嘛,那么是变量,我们就可以给变量随意的赋值,但是,把随意的数值赋值给指针变量的话,它是没有意义的,所以,这样的话,我们就叫它野指针,这种类型的指针它的区域是未知的。

不过,需要说明的一点是:

野指针它是不会直接引发错误的,只有在操作野指针所指向的内存区域时才会出现问题。

前面的文章中也有介绍过指向内存区域相关概念哦,不懂概念的小伙伴也可以去前面溜达溜达呢。

(1)野指针成因

a:指针未初始化

看例子:

所以,指针未初始化时其实就相当于一个野指针,它所指向的内存空间是随机的,那么,这时候就很有可能存在该指针和其他程序占用相同内存空间的情况,导致其他程序有可能不能正常运行,从而导致出错。 

b:指针越界访问

比如说这段代码:


#include<stdio.h>
int main()
{ 
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0;i <= 11;i++)
	{
		*(p++) = i;
		//这里当指针指向的范围超出数值arr的范围时,P就是野指针;
	}
	return 0;
}

运行结果:

程序崩了, 为什么呢,就是因为指针越界访问了。

那怎样理解指针越界呢?

    通俗的讲,就是指针出了数组的最大界限,这种情况是比较危险的,它所指向的内存空间也是随机的,是未知的,我们称这样的也为野指针。

最好的情况呢就是指向一个没有用到的内存区域,这样不会对应用程序有影响;

最坏的情况就是指向了程序的核心区域,从而导致系统崩溃,那这种情况还是比较少见的,因为一般的编译器在编译的时候会将数组的内存和程序的内存分开编译,也可以理解为它们不会在同一个区域,但也不是一定哦,所以指针越界是不允许存在的

一般可能的情况:

(1)不可预料的,程序出错,导致指针越界(这种情况少见);

(2)程序员的误操作,数组的最大范围。

比如说:

int a[100];
int *p = a;

  这里呢,p的范围只能是p -- (p+99)了,假如说出现了(p+100),那么此时这个指针已经不在数组的范围之内了,指向了本该不属于数组的区域,这就是指针越界!当对它再次进行操作的时候,其实已经不是在对这个数组里边的元素进行操作啦,而是对一个未知的单元进行操作。 

c:指针指向的空间释放

  注:这里相关的知识点后期会更新哦,大家稍安勿躁稍安勿躁,哈哈哈哈。

(2)如何规避野指针?

a:指针初始化

    这里要强调的是:当明确知道指针应该初始化为某某的地址,就直接初始化;如果不知道指针初始化为什么值时,此时,可以暂时先将指针初始化为NULL。(作为一名程序员,写代码一定得具备的素养就是让自己的代码风格良好,自己的思路清晰,使读者在阅读我们写的代码的时候都忍不住想给你一个赞,好吧~),所以,不仅仅是指针要初始化,任何变量和数组都需要初始化的呢!!!

#include<stdio.h>
int main()
{
	int a = 0; //变量初始化;
	int arr[10] = { 0 };//数组的初始化
	int* pa = NULL; // 指针初始化,初始化为空指针;

	return 0;
}

b:小心指针越界

注:指针越界在前面已经详细介绍了,在避免野指针的时候大家注意这些情况就好。

c:指针指向的空间释放,及时置NULL

说明:指针指向的空间释放是什么意思呢,其实就是说之前这个变量是存在的,但是当我对指针进行解引用操作的时候,这个变量它就不翼而飞了,销毁了,不存在了!!!那为什么呢,是因为它是个局部变量。

d:避免返回局部变量的地址

  在C语言中,局部变量是分配在栈空间上的,所以在写程序的时候,如果返回指针(变量地址),应该返回堆区或者全局区域,这样的话就可以避免那些“意想不到”的结果出现!

e:指针使用之前检查有效性

  这个的意思呢就是在使用指针之前对该指针是否有效进行检查,也就是说指针不能指向为开辟空间的变量和对空指针进行直接使用。

好啦,关于指针中有关野指针的知识就介绍到这里啦,我们下期再见!!!

小编新手一枚,如有错误的地方,欢迎大家留言,大家一起进步吖~

 

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

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

相关文章

An illegal reflective access operation has occurred警告

问题描述 今天 在 install Maven项目的时候&#xff0c;控制台出现警告如下&#xff1a; WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/E:/DevelopmentKit/Maven/…

【送书福利-第六期】Java诞生日,推荐Java“此生错过必遗憾”系列书单

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、推荐书籍三、抽奖方…

三维电子沙盘虚拟数字沙盘开发教程第9课

三维电子沙盘虚拟数字沙盘开发教程第9课 查询面板调用&#xff1a; private void Button_Click_11(object sender, RoutedEventArgs e) { GisLib.MapSech _Sech new MapSech(); //查询面板 Root.Children.Add(_Sech); Canvas.Se…

docker可视化管理工具portainer忘记密码重置教程

目录 前言&#xff1a; 1 停止portainer容器 2 借助仓库 portainer/helper-reset-password 重置密码 3 重新启动portainer容器 4 验证是否修改成功 5 修改登录密码 前言&#xff1a; 由于学习的深入&#xff0c;各种账号密码实在是太多了&#xff0c;建议各位配置账号密…

python+django在线借阅图书管理系统vue

本论文是以构建图书借阅为目标&#xff0c;使用 django框架制作&#xff0c;由系统前台、读者和管理员三大部分组成。着重论述了系统设计分析&#xff0c;系统的实现&#xff08;读者注册模块&#xff0c;读者登录&#xff0c;读者浏览图书模块&#xff0c;图书借阅模块&#…

keepalived脑裂后,近20min不能访问虚拟IP问题分析

问题现象和说明 真实的场景比较复杂&#xff0c;抽象起来可以用下面的图表示&#xff0c; #mermaid-svg-OmKwPLsGwcVuYnha {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OmKwPLsGwcVuYnha .error-icon{fill:#5522…

充分发挥C/C++test的价值(上)

对于开发测试来说&#xff0c;最有效的环境就是能够深度集成到开发人员IDE中的统一测试解决方案。例如&#xff0c;团队可能会将测试工作集中在最近更新的、高风险的代码上&#xff0c;而Parasoft C/Ctest这样的集成工具就是最合适的解决方案。 软件验证和确认&#xff08;Ver…

Vulkan Tutorial 5 顶点缓冲区

目录 16 顶点缓冲区 顶点着色器 顶点数据 管道顶点输入 17 顶点缓冲区创建 缓冲区创建 内存要求 内存分配 填充顶点缓冲区 18 暂存缓冲区 传输队列 使用暂存缓冲区 19 索引缓冲区 索引缓冲区创建 使用索引缓冲区 16 顶点缓冲区 我们将用内存中的顶点缓冲区替换…

vue-admin-template框架搭建及应用

一、框架介绍 vue-admin-template是基于vue-element-admin的一套后台管理系统基础模板&#xff08;最少精简版&#xff09;&#xff0c;可作为模板进行二次开发&#xff1b; 可以把 vue-element-admin当做工具箱或者集成方案仓库&#xff0c;在 vue-admin-template 的基础上进…

FPGA基于AXI 1G/2.5G Ethernet Subsystem实现千兆UDP通信 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明UDP层设计AXIS-FIFOAXI 1G/2.5G Ethernet Subsystem&#xff1a;输出 4、vivado工程详解5、上板调试验证并演示系统配置UDP数据回环测试注意事项 6、福利&#xff1a;工程代码的获取 1…

SpringMVC第七阶段:SpringMVC的增删改查(01)

SpringMVC的增删改查 1、准备单表的数据库 drop database if exists springmvc;create database springmvc;use springmvc; ##创建图书表 create table t_book(id int(11) primary key auto_increment, ## 主键name varchar(50) not null, ## 书名 author varchar(50) no…

敏捷缺陷「bug」跟踪管理

一般情况下&#xff0c;当前迭代的缺陷&#xff0c;建议放到本迭代的迭代看板上&#xff0c;在迭代结束前修复完成。 “缺陷看板”通常存放发布后遗留的缺陷&#xff0c;客户反馈的缺陷&#xff0c;生产环境发现的缺陷等。 在Leangoo领歌的敏捷项目中&#xff0c;默认创建了“…

安科瑞能源管理系统基于物联网技术应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:在能源形势紧张的大趋势下,高能耗的大型公共建筑能源管理系统的建设逐渐受到重视,以物联网技术及基础的建筑能源管理平台可以提供即时、准确、高效的能源管理策略。 系统阐述了结合物联网技术的建筑能源管理构建…

关于自动映射在项目中的具体落地(dozer)

关于自动映射在项目中的具体落地&#xff08;dozer&#xff09; 项目开发过程中&#xff0c;经常需要编写model之间的转换&#xff0c;最常见的有&#xff1a; 实体转DTODTO转实体 等操作,故为了简化代码的开发工作&#xff0c;需要简化对象属性之间复制的步骤&#xff0c;目…

分类、标签设计及查询优化

文章目录 问题分类和标签的设计知名开源系统的设计jive论坛Solo博客系统的设计wordpress的数据库设计 参考链接 问题 在很多业务系统中&#xff0c;都有对对象的分类和标签设计。在数据库层面如何设计相应的表&#xff0c;以及如何做查询优化&#xff0c;是一个比较普遍的问题…

MKS SERVO4257D 闭环步进电机_系列5 CAN指令说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

客户案例 | 思腾合力GPU算力节点助力实时云渲染

客户介绍 平行云是国内领先的云化XR概念倡导者与技术先行者&#xff0c;LarkXR是平行云研发的云化XR PaaS平台。LarkXR能够帮助XR领域企业级客户快速实现技术、产品及平台的云化转型&#xff0c;高效使能企业的云化XR业务&#xff0c;有效保护客户的内容安全&#xff0c;让多种…

ANDEAWELL:国产工业RFID替代潮即将到来!

受这两年国外的芯片供应不足&#xff0c;价格上涨后用户难以承受等影响&#xff0c;越来越多的企业选择国产替代芯片。随着国产替代芯片的应用增加&#xff0c;东信源芯、旗连、国芯物联等出货量也开始增加&#xff0c;可以预见的是&#xff0c;国产工业RFID替代潮即将到来! 国…

解决Maven 依赖下载不全的问题 (自测有效)

问题描述&#xff1a;从仓库拉代码下来 发现存在部分依赖下载不了。 解决方案&#xff1a;去中央仓库一个个手动下载。具体步骤如下 1.清除下载一般的依赖 &#xff08;以下代码是 .bat 文件&#xff09; echo off rem create by NettQunrem 这里写你的仓库路径 s…

类实例化和实例初始化

就算不写main方法里面的3句&#xff0c;也会执行5 1 10 6 因为main方法所在的类需要先加载和初始化 执行顺序如下&#xff1a;先初始化父类再初始化子类 静态实例变量显示赋值和静态代码块代码从上到下顺序执行&#xff08;根据书写顺序&#xff09; 子类的实例化方法&am…