1.野指针产生的原因:
1、定义指针变量的同时未对其进行初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会指向随机区域,因为任何指针变量(除了static修饰的指针变量)在被定义的时候是不会被置空的,它的默认值是随机的。
2、指针所指向的内存空间被释放时,却没有对该指针变量的值(即该指针原来指向的内存空间的地址)进行置空:我们在用库函数malloc开辟内存空间时,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()或者delete(注意delete只是一个操作符,而free()是一个函数)释放后,如果程序员没有对其置空或者其他的赋值操作,就会使其成为一个野指针。
3、指针操作超越变量作用域:勿返回指向栈内存的指针或引用,因为栈内存在函数结束的时候会被释放。比如绝不返回局部变量和局部数组的地址。
2.野指针的危害:
野指针的问题在于,指针指向的内存空间已经无效了,而该指针变量的值(即该指针原来指向的内存空间的地址)没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致段错误,野指针很难定位到是哪里出现的问题,在哪里这个指针就失效了,不好查找出错的原因。所以调试起来会很麻烦,有时候会需要很长的时间。
3.规避野指针的方法:
1、在定义一个指针时同时初始化为NULL;
例:
int *p=NULL;
2、释放指针指向的内存空间时,将指针重置为NULL。(最好在编写代码时将free()函数封装一下,在调用free()后就将指针置为NULL。
)
例:
free(p1); //只释放了p1指向的堆区空间 并没有将指针p1置为空
p1 = NULL;
程序实例演示:
错误实例:
#include <stdio.h>