欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

野指针与'关键字'NULL

程序员文章站 2022-10-05 08:47:19
野指针与'关键字'NULL 一、NULL是什么? 在C/C++中的标准定义: 在c语言中的NULL就被替换成了((void *)0),这个整体表示的是一个指针,即是指向0地址的viod类型的指针。 所以我们可以理解为NULL的本质就是0,这个0要看做地址,即是0x00000000。 NULL为什么出 ......

野指针与'关键字'null

 

一、null是什么?

  在c/c++中的标准定义:

 

#ifdef __cplusplus           //条件编译,判断是c++还是c环境
#define null    0             //c++环境
#else
#define null    ((void *)0)  //c语言环境
#endif
#endif    

 

  在c语言中的null就被替换成了((void *)0),这个整体表示的是一个指针,即是指向0地址的viod类型的指针。

  所以我们可以理解为null的本质就是0,这个0要看做地址,即是0x00000000。

  null为什么出现,就得明白什么是野指针了。

 

注:虽然c标准没有说空指针与指向内存地址0的指针相同,但是分析之后是可以这样理解的。(null又称为空指针常量)  

 

二、野指针

1.什么是野指针

  又叫迷途指针,即指针指向的地址是随机的。(不指向任何合法的对象的指针)

2.野指针的出现

  指针变量在定义后,不去初始化。这个时候,值就是随机的。这时候这个指针变量就是野指针。

比如在栈里定义了一个指针变量,即栈给这个指针变量分配了一个内存,而这个内存里存的值就是该指针指向的地址,然而栈是脏的(反复使用,不擦除),并不知道地址里存的什么数,也就不知道指针指向了哪里。 

3.野指针的危害

指针变量在定义后,不去初始化,这个时候,值就是随机的,即指向了随机的一段内存。我们再去解引用时,就是去访问一个随机地址,那么会有什么样的后果也是未知的。

一般有三种情况:

①指向了不可访问的地址(系统不允许访问的地方)

  这种情况是最好的,因为程序会报段错误,无法执行。

②指向了可用的,暂时没有用到的地方(譬如程序没有用到的堆栈地址)

这种情况运行时没问题,也不会报错。但是实际上程序是有问题的,假如之后程序由于野指针出现了bug,就死活找不到原因了。

③指向了可用的,并且是程序中正在被使用的地方

这种情况野指针的解引用可能就会导致指向的那段内存的值被修改,出现一些离奇的错误,导致程序崩溃,数据破坏,损坏。    

 打个比方:野指针就是个山贼,随机的抢劫过路商队。

  第一种情况就是

  (不可访问的地址)大型商队保镖太强,山贼(野指针)正准备抢劫就被干掉了,并向后面(我们)的商队发出了警告

  第二种情况就是

  (可以访问,暂时没用使用的地址)小型商队,山贼就直接抢了,暂时并不影响绕路的我们。

  第三种情况就是

  (程序正在使用)我们的商队,山贼可能抢的可能我们没法活下去(程序崩溃)

 

4.怎么去避免野指针

  在指针的解引用之前,一定确保指针指向一个绝对可用的空间。

  这时候null出现的很及时,常规做法

    ①定义指针后,将指针初始化为null。

    ②指针使用之前绑定一个可用地址。

    ③在指针解引用前,去判断是否为null。

    ④使用完,后赋值为null。

 

 1 int a = 1;
 2 int *p = null;     //定义指针并初始化为null
 3 p = &a;            //绑定一个可用地址
 4                 
 5 if (null != p)     //判断是否不等于null
 6 {
 7     *p = 10;       //解引用
 8 }
 9                 
10 p = null;          //使用完,重新赋值为null

 

注意(小技巧):

  一般将判断指针是否相等时,不写成if (p == null),而写成if (null == p),原因是== 与 = 的误错,程序的意思会不一样。等号少写后,if (p = null)不会报错,if (null = p)会报错。

 

三、null的作用

①让野指针指向一个 '安全的0地址处'

  大部分cpu中,内存0地址处不能随便访问的,所以避免野指针的误伤,指向0地址后的使用就会报段错误。帮助我们找错误。

②特殊标记,即增加程序的可读性。

  表示指针是个野指针。

 

四、各个零之间的区别('\0' '0' 0 null)

①'\0'是个转义字符,ascii编码值是0,本质就是0.

  '\0'用法是c语言字符串的结尾标志

②'0'是个字符,ascii编码值是48,即是48

  '0'是字符0,获取ascii编码值

③0是数字0,本质也是0

  比较一个int类型的数字是否等于0,或者给变量赋值。

④null是个表达式((void *)0),强制转换为void * 的0,本质也是0

  用来比较指针是否是一个野指针

 

 


 

作者:devil-wei

出处:https://www.cnblogs.com/devil-wei/

版权声明:本文版权归作者,转载请标注文章作者与出处