什么是野指针?通过一段代码来体会一下。
#include<stdio.h> int main(void) { int * p ; *p = 314; printf("*p = %d ",*p); }
看看打印的值是多少?是314吗?
程序运行出错了,为什么?回想一下局部变量的特点:1.分配在栈上,2.若未初始化,其值为垃圾值。这里的指针变量 p 也是局部变量,p为经初始化,p保留的值肯定是随机值,也就是说指针p指向了一个随机的地址,这行吗?给一个随机地址赋值314是不行的.我们不知道这个随机的地址是哪个程序在使用,万一搞掉别人的数据那就不好了。
这就是野指针带来的危害,写程序中我们要尽量避免野指针的出现,回顾一下如何指针来着?
指针三部曲:定义,赋初值,解引用。
上面那个指针明显没有赋初值,定义了以后直接解引用百分之九十九会崩溃的。
小结一下什么是指针?
(1)野指针就是指针指向的位置是随机的,不正确的,没有明确规定的.
(2)野指针很可能出发运行的段错误
(3)指针变量只定义,没初始化,其值也是垃圾值.指针变量中的地址访问一个位置地址的内容.若其地址是一个程序正在使用的内容则会导致程序崩溃.
#include<stdio.h> int main(void) { int a = 10; int * p = &a; *p = 314; printf("*p = %d ",*p); }
这样修改上面的代码就可以了,先让指针p指向变量a的地址,然后再解引用给a的地址赋值314。还可以这样
int * p ;
p = NULL; //给指针赋初值,让指针p指向一个确定的地址NULL
什么是NULL?
(1)NULL本质就是0地址,给指针赋值NULl,就是让他指向0地址。 0地址在操作系统中都是不可访问的。
(2)
#ifdef _cplusplus //在c++中定义 #define NULL 0 #else #define NULL (void*)0 //在c中定义(c中必须使用强制类型转换)
//完美的避免了野指针的出现
#include<stdio.h> main() { int a = 10; int * p =NULL; //定义指针同时 赋值NULL if(p = NULL) //用之前判断是否为NULL { p = &a; *p = 20; //解引用 p = NULL; //用完之后再次赋值为NULL。 } else p = NULL; }
总结:
(1)定义指针同时赋值NULL,不用的时候保持为NULL
(2)用之前判断是否为NULL,用完之后再次赋值为NULL。
记住这两点就可以避免野指针的出现了。