什么是野指针?
就是指向内存地址不确定的指针,从“野”字可以理解。
什么情况下出现野指针?
我们知道,没有初始化的全局变量和static修饰的局部变量都会被编译器默认初始化为0,所以这些指针变量的地址是确定的0,其实也是NULL,所以他们不是野指针。未赋值的局部指针变量的值是随机分配的,为野指针,例如
//错误做法
void test()
{
char * p;//此时的p就是野指针
*p=2; //由于指针位置不知道,这样直接用,可能访问了不该访问的地址,在单片机中可能产生//hardfault错误
}
//正确的做法
void test()
{
char a=0;
char * p=&a; //给指针赋值一个确定的地址,然后才能使用指针
*p=2;
}
第二种出现野指针的情况
char *p=0;
p=(char *)malloc(50*sizeo(char));
free(p);
//p=NULL;;
//如果没有调用p=NULL,那么p指向的内存已经释放了,不确定了,如果在使用可能产生不确定的后果
所以对于指针一句话,使用的指针一定是知道指向哪里的指针
什么是空指针,以及空指针的作用?
空指针比野指针要好一点,顾名思义,空指针的指向很明确,为地址0。所以不会出现非法访问的情况。但是可以直接使用空指针去访问一个存储单元吗,答案肯定是不行的,看下例
//错误做法
void test()
{
char * p=0;
*p=1; //单片机可能产生hardfault错误,思考为什么?
}
//正确做法
void test()
{
char a=0;
char *p=&a;
*p=1;
}
因为空指针只是指针的指向明确,但是0地址不是一个可用的地址。