什么是野指针?通过一段代码来体会一下。
#include<stdio.h>
int main(void)
{
int * p ;
*p = 314;
printf("*p = %d\n",*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\n",*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。
记住这两点就可以避免野指针的出现了。