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

野指针详解

1.定义

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

2.野指针成因

A.指针未初始化

#include <stdio.h>
int main()
{ int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0; }

B.指针越界访问

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

C.指针指向的空间释放

#include <stdio.h>
int* test()
{int n = 100;return &n;
}
int main()
{int*p = test();printf("%d\n", *p);return 0; }

3.如何规避野指针

A.指针初始化

  如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。

#include <stdio.h>
int main()
{int num = 10;int*p1 = &num;int*p2 = NULL;return 0; }

B.小心指针越界

  ⼀个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。

C.指针变量不再使用时,及时置NULL,指针使用之前检查有效性

  当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的时候,我们可以把该指针置为NULL。因为约定俗成的⼀个规则就是:只要是NULL指针就不去访问,同时使⽤指针之前可以判断指针是否为NULL。我们可以把野指针想象成野狗,野狗放任不管是⾮常危险的,所以我们可以找⼀棵树把野狗拴起来,就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓前来,就是把野指针暂时管理起来。不过野狗即使拴起来我们也要绕着⾛,不能去挑逗野狗,有点危险;对于指针也是,在使⽤之前,我们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是不能直接使⽤,如果不是我们再去使⽤。

int main()
{int arr[10] = {1,2,3,4,5,67,7,8,9,10};int *p = &arr[0];for(i=0; i<10; i++){*(p++) = i;}//此时p已经越界了,可以把p置为NULL
p = NULL;//下次使⽤的时候,判断p不为NULL的时候再使⽤//...p = &arr[0];//重新让p获得地址if(p != NULL) //判断{//...}return 0; }

D.避免返回局部变量的地址

如造成野指针的第3个例⼦,不要返回局部变量的地址。

4.笔记总结

相关文章:

  • Oracle中文显示???????解决办法
  • 为什么 Flink 抛弃了 Scala
  • 2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题
  • C++:一文读懂智能指针
  • js修改浏览器地址栏里url的方法
  • python -opencv 中值滤波 ,均值滤波,高斯滤波实战
  • 汽车电子 -- 根据DBC解析CAN报文
  • 电力感知边缘计算网关产品设计方案-网关系统通信架构方案
  • 生产环境出现问题,测试人如何做工作复盘?
  • 最重要的BI测试-适用于任何BI和分析平台
  • 看完就会,从抓包到接口测试的全过程解析【1500字保姆级教程】
  • 2023亚太地区数学建模C题思路分析+模型+代码+论文
  • Excel换不了行怎么解决?
  • 蓝桥杯物联网竞赛_STM32L071_2_继电器控制
  • Django框架之中间件
  • 10个确保微服务与容器安全的最佳实践
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JavaScript创建对象的四种方式
  • Javascript基础之Array数组API
  • js作用域和this的理解
  • Python_OOP
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 基于 Babel 的 npm 包最小化设置
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端面试之CSS3新特性
  • 微信小程序--------语音识别(前端自己也能玩)
  • 智能合约开发环境搭建及Hello World合约
  • 最简单的无缝轮播
  • Java总结 - String - 这篇请使劲喷我
  • 组复制官方翻译九、Group Replication Technical Details
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #DBA杂记1
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (175)FPGA门控时钟技术
  • (C语言)fread与fwrite详解
  • (八)Flask之app.route装饰器函数的参数
  • (分布式缓存)Redis持久化
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (新)网络工程师考点串讲与真题详解
  • (一)基于IDEA的JAVA基础12
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET连接数据库方式
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @angular/cli项目构建--http(2)
  • [04] Android逐帧动画(一)
  • [16/N]论得趣
  • [30期] 我的学习方法
  • [Android Studio] 开发Java 程序
  • [Android]使用Git将项目提交到GitHub