对野指针的理解

  

一个指针代表的是一个地址变量,为什么是变量呢?当然因为它的值是变化的了。

在计算机中我们找到了一个变量的地址,就相当于找到了这个变量的值,那引用的形式呢就是“*变量名”,这样我们就得到了这个变量的值。为什么会这样呢?我的理解是我们通常找一个人的时候,别人会告诉我们这个人在哪儿,如几号楼,哪个房间号,这就是这个人的地址,我们知道了这个人的地址,我们就可以找到这个人啦,这也就是为什么在计算机中我们得到了一个变量的地址,我们就找到了这个变量的值,变量的值就相当于我们要找的人,而变量的地址就相当于我们要找的这个人的地址。到此就是我对指针的一个浅理解啦!

接下来我要说的是一个现象p=NULL;这个是什么意思呢?每次我们在传指针的时候总是会检测一下,这个指针是否为空,可是为什么要检测呢?指针为空了会怎么样?

 基于这个疑问,我上网查了一下,在32位机中,主存储器它的地址空间为0X00000000~0XFFFFFFFF,那我们规定第一个地址所代表的内存空间是不可用的,(为什么不可用呢,这里我也不是很清楚)而NULL其实就是数字0,那就相当于你知道一个地址,但你又知道这个地址没有人会到哪儿去,那你知道这个地址也没什么用啊!所以这就是在计算机中指针p不能为空的原因了,因为我们的程序是不会加载到这个空间里面去的。

上面说完了指针为空,接下来我在谈谈我对野指针的理解,我们常常会看到在初始化变量的时候会把一个指针初始化为空?为什么要这样,这又不得不提到野指针了。

野指针:野指针指向一个已删除的对象或未申请访问受限内存区域的指针。

何为已删除的对象,free(p)一下,你就已经删除这个指针变量P所指向的这块内存区域的存储空间,这个时候系统会把你刚刚删除的这块内存区域标记为不可用的,意思就是现在这块区域我可以分配给其它变量了。这个时候p指向的就是已删除的对象,

还有一种情况是int*p;这个时候我们定义了一个指针变量p,但我们并没有给它赋值,这个时候我们编译一下,会有一个值,在编译一下又会有另一个值,这个时候这个指针是不断发生变化的,而这个不断变化的指针每次指向的是我们没有申请的且访问受限制的区域。

那为了避免野指针的产生,所以我们常常在free(p)后使p=NULL;即给指针p初始化一下,使得指针p有归属了。

其实野指针总结下来就一句话,你的地址值是不固定的,且每次它指向的都是系统没有分配给它的内存,这样在写代码的时候,我们就要特别注意了,在访问数组时,我们要特别小心防止我们访问越界,因为这时我们访问越界了,我们指向的就是一个没有分配的内存。还有就是你在使用函数开辟内存空间的时候,当我们不用我们申请的这块内存的时候,记得将指针置空,使得它有归属,不会在乱指一气。


猜你喜欢

转载自blog.csdn.net/weixin_40797414/article/details/80000266