野指针

 

什么是野指针?通过一段代码来体会一下。

#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。

记住这两点就可以避免野指针的出现了。

 

posted @ 2016-06-14 22:52  薛定谔的小灯泡  阅读(107)  评论(0编辑  收藏  举报