zoukankan      html  css  js  c++  java
  • 野指针

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

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

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

  • 相关阅读:
    虚拟DOM和diff算法
    面向对象之封装
    面向对象之类和函数的属性
    面向对象之__init__方法
    面向对象之初始类和对象
    面向对象与面向过程详解
    CSS高级技巧
    CSS定位
    模块之re模块详解
    模块之logging模块详解
  • 原文地址:https://www.cnblogs.com/1024E/p/13209627.html
Copyright © 2011-2022 走看看