----在上一篇c专题指针文章中,我们介绍了什么是指针,文章里面从普通变量进而引出指针的概念,这样对指针的理解有一定的帮助(其实最好的理解,就是要明白硬件里面的内存原理,这是理解指针最好的地方,就好比说会汇编语言的人来去理解指针这里跟不会指针的人去理解,会有很大的差异的,在学汇编的时候,会接触到好多有关计算机里面内存的大话题,这个对于搞汇编的来说,掌握了汇编,对理解指针的原理非常容易;而大部分人(当然也包括我自己),刚开始学指针,是真的非常吃力,学了一阵子,感觉是学会了,但是一段时间没有去接触指针,再次来看指针的话,感觉一脸懵逼,好像没学过一样,不知道大家有没有我这样的经历,哈哈哈;这里指出不是鼓励大家去学花太多时间在汇编上(个人观点,现在出来上班,好少会搞汇编开发,你搞stm32和一些稍微功能强大的芯片,拿汇编去写,那简直不敢想象,而且也没听过谁这样干过),其实还是当你用到的时候再去学,很快上手的,就是有好多汇编指令要记,如果你一遍学一遍用,反而会学的更快,理解的更深,而且现在对理解一些高级芯片里面的启动代码会非常有帮助的)。好了,废话太多,来进入主题!

一、空指针:

1、什么是空指针?

在C语言中,如果一个指针不指向任何数据,我们就称之为空指针,用NULL表示,例如:

1         int     *a    =    NULL;

NULL在C/C++中定义为:

1 #ifdef _cplusplus        // 定义这个符号就表示当前是C++环境
2 #define NULL 0    // 在C++中NULL就是0
3 #else
4 #define NULL (void *)0 // 在C中NULL是强制类型转换为void *的0
5 #endif

说明:a、在C语言中,int *p;你可以p = (int *)0;但是不可以p = 0;因为类型不相同。所以NULL的实质其实就是0,然后我们给指针赋初值为NULL,其实就是让指针指向0地址处。为什么指向0地址处?2个原因。第一层原因是0地址处作为一个特殊地址(我们认为指针指向这里就表示指针没有被初始化,就表示是野指针);第二层原因是这个地址0地址在一般的操作系统中都是不可被访问的,如果C语言程序员不按规矩(不检查是否等于NULL就去解引用)写代码直接去解引用就会触发段错误(下面讲野指针有举例子),这种已经是最好的结果了。

b、一般在判断指针是否野指针时,都写成if (NULL != p)而不是写成 if (p != NULL)原因是:如果NULL写在后面,当中间是==号的时候,有时候容易忘记写成了=,这时候其实程序已经错误,但是编译器不会报错。这个错误(对新手)很难检查出来;如果习惯了把NULL写在前面,当错误的把==写成了=时,编译器会报错,程序员会发现这个错误(这里自己昨天就在这里犯了低级错误

)。

一、野指针:

1、什么是野指针?

简单来讲它就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),想必有一定基础的好友,一定看过这样的代码:

1 #include <stdio.h>
2 int main()
3{
4int *a;
5 *a=9;
6
7 return 0;
8
9 }

说明:这里是在gcc编译器下,会出现段错误(Sgmentation fault);但是在dev--c++上是不会报错的。因为指针变量在定义时如果未初始化,值也是随机的。指针变量的值其实就是别的变量(指针所指向的那个变量)的地址,所以意味着这个指针指向了一个地址是不确定的变量,这时候去解引用就是去访问这个地址不确定的变量,所以结果是不可知的。

2、野指针的危害:

a、指向不可访问(操作系统不允许访问的敏感地址,譬如内核空间)的地址,结果是触发段错误,这种算是最好的情况了。

b、指向一个可用的、而且没什么特别意义的空间(譬如我们曾经使用过但是已经不用的栈空间或堆空间),这时候程序运行不会出错,也不会对当前程序造成损害,这种情况下会掩盖你的程序错误,让你以为程序没问题,其实是有问题的。

c、指向了一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说是程序的一个变量x),那么野指针的解引用就会刚好修改这个变量x的值,导致这个变量莫名其妙的被改变,程序出现离奇的错误。一般最终都会导致程序崩溃,或者数据被损害。这种危害是最大的。

------小结: 指针变量如果是局部变量,则分配在栈上,本身遵从栈的规律(反复使用,使用完不擦除,所以是脏的,本次在栈上分配到的变量的默认值是上次这个栈空间被使用时余留下来的值),就决定了栈的使用多少会影响这个默认值。所以我们要避免这种情况发生。

3、怎样来避免野指针的出现?

野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向一个可用的内存空间),然后去解引用。因此个人推荐大家一般常用的方法:

第一点:定义指针时,同时初始化为NULL

第二点:在指针解引用之前,先去判断这个指针是不是NULL

第三点:指针使用完之后,将其赋值为NULL

第四点:在指针使用之前,将其赋值绑定给一个可用地址空间

 1  #include <stdio.h>2  int main()3 {4   int a;5   int *b=NULL;6 b=&a;// 正确的使用指针的方式,是解引用指针前跟一个绝对可用的地址绑定7  if(NULL != b)8  {9   *b=8;
10  }
11   b=NULL;
12   return 0;
13     }

注明:一般来说,定义一个指针都会给初始化一个有效地址来操作。

三、总结:

现在看完文章,你应该对指针的使用一定要注意给初始化,否则就会出现问题。再次强调一下:void 指针与空指针 NULL 不同,NULL 说明指针不指向任何数据,是“空的”;而 void 指针实实在在地指向一块内存,只是不知道这块内存中是什么类型的数据。如果文章对您有帮助,记得点个关注,或者可以关注公众号:TXP嵌入式

指针 是否相同_c专题之指针---野指针和空指针解析相关推荐

  1. c语言 free参数 指针,C语言之free函数以及野指针介绍

    [FROM MSDN && 百科]原型:void free(void *ptr); #include或#include Deallocate space in memory 释放ptr ...

  2. 什么是野指针和内存泄露?如何避免野指针

    内存泄露: (1). 访问已经释放的内存; (2) 访问没有权限的内存 野指针: 指向内存被释放的内存或者没有访问权限的内存的指针. "野指针"的成因主要有3种: (1) 指针变量 ...

  3. linux野指针追踪,【华清远见】野指针和空指针的两个小点

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:吕老师,华清远见嵌入式学院讲师. 大家都知道指针的学习对于c语言学习来说可谓是至关重要的,下面我们来说一下在指针中两种比较特殊的关于指针的概念,野指 ...

  4. c语言编程中野指针错误,C程序中可怕的野指针

    一.疑问点 指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程序时,经常遇到的一种错误的使用方法,也许在你的学习 ...

  5. c6011取消对null指针的引用_C++中的野指针及其规避方法

    今天在调试程序过程中,用到了一些指针的方法,这里记录一下野指针的概念. 1.概念 野指针,也就是指向不可用内存区域的指针.通常对这种指针进行操作的话,将会使程序发生不可预知的错误. 野指针与空指针(N ...

  6. 野指针 空指针 悬空指针 智能指针

    C语言中"野指针"."悬空指针"是什么? C语言中"野指针"."悬空指针"是什么?_不脱发的程序猿的博客-CSDN博客_ ...

  7. C语言中“野指针”、“悬空指针”是什么?

    目录 1."野指针"(wild pointer) 2."悬空指针"(dangling pointer) 1."野指针"(wild point ...

  8. C语言之free函数及野指针

    [FROM MSDN && 百科] 原型:  void free(void *ptr); #include<stdlib.h>或#include <malloc.h& ...

  9. 【C 语言】指针数据类型 ( 野指针 | 避免野指针推荐方案 )

    文章目录 一.野指针 二.避免野指针推荐方案 一.野指针 参考 [C 语言]内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 ) 四. 野指针 ( 程序BUG根源 ...

最新文章

  1. 2022-2028年中国电动汽车充换电站市场深度调研及投资前景预测报告(全卷)
  2. 2015年编程之美(资格赛) ---2月29日
  3. [转]OData and Authentication – Part 6 – Custom Basic Authentication
  4. MapReduce编程系列 — 2:计算平均分
  5. MyBatis4:动态SQL
  6. Python中必学知识点:类方法、实例方法和静态方法
  7. windows下的NTP服务
  8. SOLID 原则的可靠指南
  9. 设计模式13_享元模式
  10. golang使用go-sql-driver实现mysql增删改操作
  11. 集合源码解析Map容器Gc回收算法
  12. 全赔你们要1200亿!知网哭穷:我们一年净赚还不到2亿
  13. You may need an appropriate loader to handle this file type, currently no loaders are configured to
  14. VS2008SP1的MFC测试-(OFFICE2007风格)Ribbon风格(DJ尐舞图形画板2008)
  15. openGauss长沙Meetup | 共建数据库可信开源社区
  16. ld-linux-x86-64.so.2挖矿木马,排查操作记录
  17. 网站接入服务器必须备案吗,服务器和域名必须备案吗
  18. iMeta|湘雅医院刘庆组-泛癌分析揭示铜死亡调节子的临床和分子特征
  19. 获投5亿元E轮融资,百分点能否成为数据+AI领域的独角兽?
  20. TS科普11 PES包句法解析

热门文章

  1. java解析c上传十六进制_磕代码c/c++/java:十六进制转十进制
  2. js实现横向跑马灯效果
  3. xps数据怎么导出为txt_使用ExportAsFixedFormat方法将数据导出到PDF或XPS.docx
  4. ngx_lua 模块
  5. gdb调试多进程和多线程命令 .
  6. 8g ubuntu 树莓派4b_树莓派4B(4G版本)安装Ubuntu 19.10
  7. allpairs使用方法_软件测试|正交试验测试用例设计方法
  8. lnmp ubuntu mysql装不上_ubuntu1.8安装lnmp失败
  9. python结构嵌套_python2.3嵌套if结构:
  10. abs 不会整数 方法 溢出_在 Golang 中针对 int64 类型优化 abs()