单片机编程中的野指针以及空指针的使用

2019-04-15 11:55发布

什么是野指针? 就是指向内存地址不确定的指针,从“野”字可以理解。 什么情况下出现野指针? 我们知道,没有初始化的全局变量和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地址不是一个可用的地址。