野指针与'关键字'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/
版权声明:本文版权归作者,转载请标注文章作者与出处
上一篇: python教程(二)·变量
下一篇: Python全栈Day 16部分知识点