野指针

简介: 野指针

概念:

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

野指针比喻为路上的野狗,没有主人的

野指针成因

1、指针不初始化

TIP:局部变量和全局变量的初始化

局部变量表示在主函数内部创建的变量(在main函数大括号里面创建的变量),局部变量不初始化,就默认是随机值

而全局变量不初始化,默认是0.

int main()
{
//这里的p就是野指针
int* p;//p是一个局部的指针变量,局部变量不初始化的话,默认是随机值
*p = 20;
return 0;
}

这里的底层逻辑就是非法访问内存空间。你必须跟编译器申请自己内存空间,不能随便就访问了一块内存,这就是非法的。比如你入住宾馆,必须申请属于自己的房间入住,不能随便进入一间房间,这就是非法的

2、指针越界访问

当指针指向的范围超出超出数组arr的范围时,指针就是野指针。

int main()
{
int arr[10] = { 0 };
int* p = arr;
for (int i=0;i<=10;i++)
  {
//当指针指向数组外界,此时就变成野指针
*p = i;
p+=1;
  }
for (int i=0;i<=9;i++)
  {
printf("%d ", arr[i]);
  }
return 0;
}

3、指针指向的空间释放

本来申请的空间被释放了,但指针还记得原地址,在进行访问时 仍会造成非法空间内存访问。

在动态内存开辟是会讲到。

另一种场景:

int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
*p = 20;
return 0;
}

在自定义函数中创建的变量,出去这个函数体,在函数中创建的变量就会自动销毁(生命周期)

所以在出test这个函数体后,a所申请的内存空间会自动销毁,而主函数中再次调用这个地址时,就会造成非法内存空间访问,也就是野指针!

如何规避野指针

1、指针初始化

其实一个好的编程习惯就是,不管什么类型的变量你在定义时都要先初始化。

初始化指针的两种方式

(1)、当不知道指针初始化什么类型时,用空指针NULL代替。

(2)、明确初始化的值

int main()
{
int* p = NULL;
int a = 10;
int* s = &a;
return 0;
}

2、自我检查数组是否存在越界情况

因为C语言不能自己检查数组是否越界。

总结:

为了在写代码时尽量规避野指针的出现,我们要做到以下几点。

1、当一个指针不知道指向哪里时,我们将其指向空指针。

2、当那个指针指向的空间释放的时候,将其指向空指针。

3、当指针知道具体指向那个空间,我们就将其指向具体的空间

此时,我们只需要判断指针是否为空指针,是空指针我们根本不需要解引用。是具体的指针我们再进行解引用

相关文章
|
10月前
|
安全 算法 Java
Java“SSLException”错误解决
Java“SSLException”错误通常发生在SSL/TLS连接过程中,可能是由于证书问题、握手失败或加密套件不匹配等原因引起。解决方法包括检查服务器证书、配置信任库、确保JDK版本兼容等。
1743 4
|
缓存 JavaScript
mac下完全卸载Node.js
mac下完全卸载Node.js
1073 0
|
12月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
9月前
|
SQL 数据库
gbase8a 公用表表达式(CTE)语法介绍
gbase8a 公用表表达式(CTE)语法介绍
|
设计模式 安全 图形学
Unity精华☀️ 面试官眼中的「设计模式」
Unity精华☀️ 面试官眼中的「设计模式」
|
11月前
|
PyTorch 测试技术 算法框架/工具
Python中Thop库的常见用法和代码示例
肆十二在B站分享了关于THOP(Torch-OpCounter)的实战教学视频。THOP是一个用于计算PyTorch模型操作数和计算量的工具,帮助开发者评估模型复杂度和性能。本文介绍了THOP的安装、使用方法及基本用例,包括如何计算模型的FLOPs和参数量。
892 0
|
存储 数据处理 Apache
万字长文 | 泰康人寿基于 Apache Hudi 构建湖仓一体平台的应用实践
万字长文 | 泰康人寿基于 Apache Hudi 构建湖仓一体平台的应用实践
634 0
|
安全 Windows
win10修改本地host文件,用以增加自定义本地访问域名127.0.0.1
win10修改本地host文件,用以增加自定义本地访问域名127.0.0.1
1210 0
|
程序员 Linux C语言
【cmake 项目依赖冲突】CMake进阶:优雅解决目标依赖和安装问题
【cmake 项目依赖冲突】CMake进阶:优雅解决目标依赖和安装问题
1543 0