我又来了,勤奋博主上线啦,哈哈哈。本篇文章呢,主要简单介绍一下指针中野指针的相关知识。
野指针
那在对它进行深入了解时,先得知道什么叫野指针吧,那什么是野指针呢?
野指针就是:指向的内存地址是未知的,也就是随机的,不正确的,没有明确限制的。
前面我们讲过,指针变量也是变量嘛,那么是变量,我们就可以给变量随意的赋值,但是,把随意的数值赋值给指针变量的话,它是没有意义的,所以,这样的话,我们就叫它野指针,这种类型的指针它的区域是未知的。
不过,需要说明的一点是:
野指针它是不会直接引发错误的,只有在操作野指针所指向的内存区域时才会出现问题。
前面的文章中也有介绍过指向内存区域相关概念哦,不懂概念的小伙伴也可以去前面溜达溜达呢。
(1)野指针成因
a:指针未初始化
看例子:
所以,指针未初始化时其实就相当于一个野指针,它所指向的内存空间是随机的,那么,这时候就很有可能存在该指针和其他程序占用相同内存空间的情况,导致其他程序有可能不能正常运行,从而导致出错。
b:指针越界访问
比如说这段代码:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0;i <= 11;i++)
{
*(p++) = i;
//这里当指针指向的范围超出数值arr的范围时,P就是野指针;
}
return 0;
}
运行结果:
程序崩了, 为什么呢,就是因为指针越界访问了。
那怎样理解指针越界呢?
通俗的讲,就是指针出了数组的最大界限,这种情况是比较危险的,它所指向的内存空间也是随机的,是未知的,我们称这样的也为野指针。
最好的情况呢就是指向一个没有用到的内存区域,这样不会对应用程序有影响;
最坏的情况就是指向了程序的核心区域,从而导致系统崩溃,那这种情况还是比较少见的,因为一般的编译器在编译的时候会将数组的内存和程序的内存分开编译,也可以理解为它们不会在同一个区域,但也不是一定哦,所以指针越界是不允许存在的
一般可能的情况:
(1)不可预料的,程序出错,导致指针越界(这种情况少见);
(2)程序员的误操作,数组的最大范围。
比如说:
int a[100]; int *p = a;
这里呢,p的范围只能是p -- (p+99)了,假如说出现了(p+100),那么此时这个指针已经不在数组的范围之内了,指向了本该不属于数组的区域,这就是指针越界!当对它再次进行操作的时候,其实已经不是在对这个数组里边的元素进行操作啦,而是对一个未知的单元进行操作。
c:指针指向的空间释放
注:这里相关的知识点后期会更新哦,大家稍安勿躁稍安勿躁,哈哈哈哈。
(2)如何规避野指针?
a:指针初始化
这里要强调的是:当明确知道指针应该初始化为某某的地址,就直接初始化;如果不知道指针初始化为什么值时,此时,可以暂时先将指针初始化为NULL。(作为一名程序员,写代码一定得具备的素养就是让自己的代码风格良好,自己的思路清晰,使读者在阅读我们写的代码的时候都忍不住想给你一个赞,好吧~),所以,不仅仅是指针要初始化,任何变量和数组都需要初始化的呢!!!
#include<stdio.h>
int main()
{
int a = 0; //变量初始化;
int arr[10] = { 0 };//数组的初始化
int* pa = NULL; // 指针初始化,初始化为空指针;
return 0;
}
b:小心指针越界
注:指针越界在前面已经详细介绍了,在避免野指针的时候大家注意这些情况就好。
c:指针指向的空间释放,及时置NULL
说明:指针指向的空间释放是什么意思呢,其实就是说之前这个变量是存在的,但是当我对指针进行解引用操作的时候,这个变量它就不翼而飞了,销毁了,不存在了!!!那为什么呢,是因为它是个局部变量。
d:避免返回局部变量的地址
在C语言中,局部变量是分配在栈空间上的,所以在写程序的时候,如果返回指针(变量地址),应该返回堆区或者全局区域,这样的话就可以避免那些“意想不到”的结果出现!
e:指针使用之前检查有效性
这个的意思呢就是在使用指针之前对该指针是否有效进行检查,也就是说指针不能指向为开辟空间的变量和对空指针进行直接使用。
好啦,关于指针中有关野指针的知识就介绍到这里啦,我们下期再见!!!
小编新手一枚,如有错误的地方,欢迎大家留言,大家一起进步吖~