野指针问题
1、什么是野指针?哪里来的?有什么危害?
(1)、野指针,就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)
(2)、野指针的存在很大可能会触发运行时出现段错误(Sgmentation fault)
(3)、因为野指针在定义时如果未初始化,值也是随机的。指针变量的值其实就是别的
变量(指针所指向的那个变量)的地址,这就意味着这个指针指向了一个地址是
不确定的变量,这个时候如果去解引用的话,就是去访问这个地址不确定的变量,
所以结果是不可知的。
(4)、野指针因为指向地址是不可预知的,所以有3种情况:
第一种:指向不可访问的地址,触发段错误
第二种:指向一个可用的、而且没什么特别意义的空间;这种程序运行不会出错,
也不会对当前程序造成损害,其实是有问题的。
第三种:指向一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说某个变量a),
那么野指针的解引用就会刚好修改这个变量的a的值,导致这个变量莫名其妙的被改变,
程序出现离奇的错误。一般最终都会导致程序崩溃,或者是数据被损害。这种危害是最大的。
2、怎么避免野指针?
(1)、野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向
一个可用的地址空间),然后去解引用。
(2)、常规的做法:
第一步:定时指针时,同时初始化为NULL
第二步:在指针解引用之前,先去判断这个指针是不是NULL
第三步:指针使用完之后,将其赋值为NULL
int main(void)
{
int a;
int *p = NULL;
//省略若干行代码
p = &a;//正确使用指针的方式,是解引用指针之前跟一个绝对可用的地址绑定
if(NULL != p)
{
*p = 4;
}
p = NULL;//使用完之后,记得将其重新赋值为NULL
}
3、NULL到底是什么?
(1)、NULL在c/c++中定义为:
#ifdef _cplusplus //定义这个符号就表示当前环境是C++环境
#define NULL 0 //在C++中NULL就是0
#else
#define NULL (void *) 0 //在C中NULL是强制类型转换为void * 的 0
#endif
(2)、在C语言中,int *p; p = (int *)0;这是可以的;但是p = 0;这是不可以的,因为类型不相同,p是int *;0是int;
(3)、所以NULL的实质就是0,然后我们给指针赋初值为NULL,其实就是让指针指向0地址处。为什么这么做:
原因1:0作为一个特殊地址(我们认为指针指向这里就表示没有被初始化,就表示野指针)
原因2:地址0在一般的操作系统中都是不可以被访问的,如果程序不检查是否等于NULL就去解引用就会触发段错误。
|