【C语言】什么是野指针?

今天有一个28级的学弟问我什么是野指针?是一个指向任意位置的指针就是野指针吗?这是一个很常见的基础概念上的混淆,对于一些初学指针的同学来说野指针、空指针、地址、内存这些都是很难以理解的部分。这篇文章我来讲解一下野指针的概念和危害。

在阅读这篇文章之前一定要有了指针、地址、内存这些基础内容的概念,本文不针对这些基础再进行深入阐述。

指针基础

指针其实就是一个用于操作内存的变量、内存就是用于存储实际数据的空间,每个空间都有自己独有的地址。

我们可以将内存理解为一堆房子组成的小镇,每个房子都有自己独特的地址,我们只有找到地址才能进入房子去使用房子里面的东西,那我们怎么能拿到地址呢?这时候就有了指针,指针就像一个带有某个房子地址的钥匙扣🔑,我们用指针指向这个地址,就可以帮我们找到房子(也就是内存),然后就可以获取到里面的东西了。

野指针

野指针实际上就是一个指针使用上的错误操作,是指一个指针指向了一个非法的内存空间。

  • 危害:可能导致程序崩溃、数据损坏、安全漏洞


**例子1:**指针定义了但是没有进行初始化。这时候指针指向的是一个随机的地址,这时候使用指针会出现不可知的错误。所以指针在定义的时候一定要赋值为空。

cpp 复制代码
int *ptr;  // 野指针,指向随机地址

例子2: 我们使用指针指向了一块内存空间之后,指针就有了这块内存空间的地址,但是我们在后续过程中使用 free 将这个空间回收掉了,但是没有将指针的地址赋值为空,后续再次用这个指针进行访问,导致出错。也就是说这个指针有着一个地址,但是这个地址所对应的内存不存在了,就会导致我们再后续再次使用这个指针去访问内存的时候出问题。这时候这个指针又叫做悬空指针

cpp 复制代码
int *ptr = malloc(sizeof(int));
*ptr = 10;
free(ptr); 
// ptr现在成为悬空指针
// *ptr = 20;  // 危险操作!

空指针

空指针实际上才是指向了一个地址为空的指针,空指针是一个安全的操作。他是不会指向任何的内存空间。

cpp 复制代码
int *ptr = NULL;  // 安全的初始化

我们在正确的回收掉内存空间后,要正确的将指针赋空才是一个完整的安全操作。

cpp 复制代码
int *ptr = malloc(sizeof(int));
*ptr = 10;
free(ptr); 
ptr = nullptr;
相关推荐
无相求码36 分钟前
C程序的内存到底怎么分的?栈、堆、全局区一张图讲清楚
c语言
天空'之城1 小时前
C 语言工业级通用组件手写 08:精准软件消抖
c语言·嵌入式开发·工业级组件·软件消抖·按键防抖
Legendary_0083 小时前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
会飞的小新4 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
爱刷碗的苏泓舒5 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言
无相求码5 小时前
指针的5层境界,从入门到劝退:C语言指针进阶全解析
c语言
C++ 老炮儿的技术栈6 小时前
基于MFC+原生GDI手动自绘仪表盘控件
c语言·c++·visual studio·控件·工业控制·gdi·自绘
小肝一下6 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
炸膛坦客15 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
程序员Rock1 天前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机