1.野指针是指没有初始化的指针,如下:
#include<stdio.h>
int main(int argc,char * argv[]){
int *p;
return (*p&0x7f);
}
显然,这个指针p没有初始化就使用了,我们称这种指针为野指针(wild pointer);
这里需要补充一点,如果是静态局部变量,也就是带static的变量,那么它不是野指针,例如这样
int main()
{
static int *a;
cout << a << endl;
return 0;
}
这个a变量不是野指针,因为它是有初始值的,静态指针变量的初始值为0;
当然,这个程序是通不过编译的,所以野指针在一般情况下,更容易被发现。然而迷途指针的发现就难了。
2,迷途指针(悬空指针)(dangling pointer):
#include <stdio.h>
int main(int argc,char *argv[]){
int *p=(int *)malloc(sizeof(int *));
free(p);//此时p为迷途指针。
p=NULL;//当把指针设置为NULL时候,此时指针不再是迷途指针。
}
每一个变量的生命周期都离不开他的作用域,如果超过了他的作用域,很有可能使指向他的指针成为迷途指针,所谓迷途指针,不过是一个长声明周期的指针指向了一个短生命周期的变量引起的,不管这个变量是在栈内存还是在堆内存。如下:
int main(){
int *P=NULL;
{
int a=100;
p=&a;
}
//一旦离开了变量a的作用域,那么p就是一个迷途指针了。
return 0;
}
还有下面一个例子:
int * func(){
int i=5;
return &i;
}
此时func()函数返回的指针也是迷途指针,虽然在短时间内,可以对指针解引用得到5,但如果func()的栈帧被别的调用函数覆盖了,那么我们就得不到我们想要的结果了,这就是迷途指针的危害。如果真想一直得到这个变量5,我们可以在便令前面加static,让他的生命周期变长。