本期介绍
主要介绍:什么是空指针,什么是野指针,野指针和空指针的区别,导致野指针出现的情况,野指针的危害有那些,该如何避免野指针的出现。
我们在学习C语言指针这一章节时一定听过空指针这一概念,但我想有些同学应该会把指针未初始化认为是空指针,因为当年我在学习的时候就是这么认为的。现在就让我来纠正这一观点吧,未初始化的指针其实应该被称为野指针,这与空指针是两个截然不同的概念。下面就有我来仔细讲解一下吧。
什么是空指针?就是指向对象为空的指针就被称为空指针,即就是给指针初始化或赋值NULL(NULL所对应的ASCII码就是0),那么该指针就被称为空指针。如若你尝试打印指向空的指针的地址值,这时你会发现输出的结果为0x00000000。如下图所示:
但值得注意的是:这里的空指针p并不表示指向0x00000000地址的存储单元,而是表示不指向任何有效空间,虽然输出是如此。当然若你想对空指针进行解引用操作系统会报错,因为既然空指针代表着不指向任何有效空间,那去访问该空间是不是就毫无意义了呀!
野指针: 指针指向的位置是不可知的、随机的、没有明确限制的。到现在为止我觉得最为常见的产生野指针的情况有三种:
1.指针未初始化
2.指针越界访问
3.指针指向的空间释放
当在编写代码的时候,若创建的一个指针变量未初始化且直接引用的该指针,那么这时该指针就是一个野指针。还需注意:未初始化的指针变量编译器是会报错的,例子如下:
这种情况,经常出现在对数组解引用访问的时候出现,下面举个例子。其实数组的下标越界访问的时候,编译器是不会发注警告的,所以这时候就一定要注意了,越界改变了不属于你空间的内容将会出现一些非常无厘头的错误,你防不胜防。所以应该尽量避免数组的越界访问
这种野指针是经常在函数返回类型为指针且该指针指向的空间出了函数会被释放掉的情况下出现。为什么这种情况下也是野指针呢?你想啊,你返回的地址所指向的空间已经被释放掉了,也就是说该空间已经不归你所有了已经还给操作系统了,那你再使用该指针来访问这块空间是不是就有点说不过去了呀。如下图所示:
看到这有些同学就会问了,诶不是说test()函数调用结束后局部变量arr所在空间的就会被释放掉吗?为什么里面存放的值没有改变?这里就要说明一点了,释放并不是把该空间里所存放的数据全部清空置零,而是把该空间还给操作系统了,也就是说该空间已经不是你所拥有的了。这里面的数据并不一定会发生改变,只有当下一次用到该空间时候才有可能发生改变,举个例子:
野指针的危害: 野指针在程序中的出现其实是非常危险的,为什么呢?我们都知道野指针是指向一个不可知地址的指针,既然是未知的那就有一定的可能会指向一个我们正在使用的空间,而又恰好解引用了该野指针,那带来的后果是不堪设想的,什么样的错误都有可能出现!!!因为谁晓得它恰好会改变内存中的什么东西呢,对吧。所以说我们应该尽量避免野指针的出现。
规避野指针方法:
1.指针初始化
2.小心指针越界
3.指针指向空间释放及时置NULL
4.避免返回局部变量的地址
5.指针使用之前检查有效性
这份博客如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位点赞评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧。