野指针的产生及其危害

我们在学习C语言的时候,经常说道野指针的问题,那么到底什么是野指针呢?我们又是如何创造出野指针的呢??野指针会产生什么样的影响呢???下面就来一一解答这3个问题。

什么是野指针
野指针:我们已经理解指针是会指向一个内存单元的,而野指针就是说,这个指针指向的地址是我们不可知的,也就是随机的。

野指针是如何产生的
野指针的产生有以下3种情况

//1、定义一个指针变量时没有初始化
int *p;
//都知道我们在定义一个非指针的变量时如果没有初始化,
//则这个变量的值是随机的(如:int a;)
//指针变量同样如此,指针变量的随机值的意思就是说他指向的位置是随机的


//2、动态开辟的内存空间在使用完后调用free函数释放掉这段内存空间,
//却没有将对应的指针职位NULL。虽然开辟的空间被释放掉但指针依旧存在。
int func()
{
    int *p = malloc(sizeof(int));
    free(p);//没有将p值为NULL的操作 
}

//3、对指针的操作已经超出了指针变量的作用域
//比如通常我们实现了一个函数,该函数里创建了一个指针变量,
//而函数结束时最终返回这个指针变量,但是函数调用结束后,
//该函数的函数栈帧就会被销毁,所以返回的这个指针变量所指
//向的空间已经被释放了
//因此这个指针变量指向的空间就变成了随机的。

使用野指针会产生的后果
我们知道野指针是指向一个不可知地址的指针,这里分为3种情况:

1、指向不可访问的地址
危害:触发段错误。
2、指向一个可用的,但是没有明确意义的空间
危害:程序可以正确运行,但通常这种情况下,我们就会认为我们的程序是正确的没有问题的,然而事实上就是有问题存在,所以这样就掩盖了我们程序上的错误。
3、指向一个可用的,而且正在被使用的空间
危害:如果我们对这样一个指针进行解引用,对其所指向的空间内容进行了修改,但是实际上这块空间正在被使用,那么这个时候变量的内容突然被改变,当然就会对程序的运行产生影响,因为我们所使用的变量已经不是我们所想要使用的那个值了。通常这样的程序都会崩溃,或者数据被损坏。

如何避免
既然我们现在已经知道了野指针产生的原因,如此,只要我们不犯这几种错误就可以很好的避免野指针的产生。

1、定义一个指针变量时一定记得初始化
2、动态开辟的内存空间使用完free之后一定将对应的指针置为NULL
3、不要在函数中返回栈空间的指针和引用
4、注意在使用时对指针的合法性的判断

猜你喜欢

转载自blog.csdn.net/qq_40927789/article/details/80686723