谈谈对野指针的理解

野指针说白了就是指向不明确或者指向没有意义的指针,野指针的产生归咎于以下3种情况。
首先说一下空指针(null pointer),空指针不指向任何对象或者函数,反过来说任何对象或者函数的地址都不能是空指针。空指针如何创建?

int * pt=NULL;

空指针NULL和内存首地址0x0的区别?
空指针不指向任何对象,指针值为0x0,但对指针进行解除引用*pt是没有意义的,因为它不指向实际的内存。内存0地址的地址值也是0x0,但是对内存0地址解除引用是有意义的。

情况1:定义了一个指针,但是并没有初始化,此时指针的指向是不明确的。

//指针pi和pd指向不明确,并不知道具体指向了内存的哪个位置
int * pi;
double * pd;

情况2:我们有时候需要通过动态内存分配(new或者malloc)分配一段内存块,并且定义了对应的指针指向该内存块。当程序结束时,需要通过(free或delete)回收内存。如下所示,分配了两段64bytes的内存,并且由pt1和pt2指向。

//动态内存分配和内存回收
int * pt1=(int *)malloc(16*sizeof(int));
int * pt2=new int [16];

//显示指针指向的内存地址值和内存存储的值
printf("%p %p \n",pt1,pt2);
printf("%d %d \n",*pt1,*pt2);

//内存回收
free(pt1);
delete pt2;

//显示指针指向的内存地址的值和内存存储的值
printf("%p %p \n",pt1,pt2);
printf("%d %d \n",*pt1,*pt2);          //这一行将会出错

//将pt1和pt2变成空指针
pt1=pt2=NULL;

由动态内存分配的两段内存经过回收后,程序已经无法再通过指针pt1和pt2访问内存中的数据,但是指针仍然指向这段内存块,即指针的值仍然不变,此时指针pt1和pt2便成为了野指针。为了防止野指针的产生,避免非法访问,可以将野指针转化为空指针(NULL)。

情况3:当指针的存储周期大于指针所指向的变量的存储周期时,当变量的作用域结束之后,对应的指针便成为了野指针。
如下代码,for循环属于一个代码段,num的作用域为for循环体,循环结束后,num的内存便会被回收,num变量不再存在。指针pt位于for循环之外,因此作用域包括但不局限于for循环,因此循环结束后,pt仍然存在,且指向原来num所在的内存位置,然而这段内存已经被回收,因此指向无意义,pt成为野指针。

//声明一个全局变量指针pt并初始化为空指针,不指向任何对象
int * pt=NULL;
for(int i=0;i<10;i++)
{
    int num;
    num=i;
    pt=#
}

你可能感兴趣的:(谈谈对野指针的理解)