zoukankan      html  css  js  c++  java
  • C语言-野指针

    野指针问题
    1、什么是野指针?哪里来的?有什么危害?
    (1)、野指针,就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)
    (2)、野指针的存在很大可能会触发运行时出现段错误(Sgmentation fault)
    (3)、因为野指针在定义时如果未初始化,值也是随机的。指针变量的值其实就是别的
           变量(指针所指向的那个变量)的地址,这就意味着这个指针指向了一个地址是
        不确定的变量,这个时候如果去解引用的话,就是去访问这个地址不确定的变量,
        所以结果是不可知的。
    (4)、野指针因为指向地址是不可预知的,所以有3种情况:
        第一种:指向不可访问的地址,触发段错误
        第二种:指向一个可用的、而且没什么特别意义的空间;这种程序运行不会出错,
                也不会对当前程序造成损害,其实是有问题的。
        第三种:指向一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说某个变量a),
        那么野指针的解引用就会刚好修改这个变量的a的值,导致这个变量莫名其妙的被改变,
        程序出现离奇的错误。一般最终都会导致程序崩溃,或者是数据被损害。这种危害是最大的。
    2、怎么避免野指针?
    (1)、野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向
           一个可用的地址空间),然后去解引用。
    (2)、常规的做法:
     第一步:定时指针时,同时初始化为NULL
     第二步:在指针解引用之前,先去判断这个指针是不是NULL
     第三步:指针使用完之后,将其赋值为NULL
     int main(void)
     {
      int a;
      int *p = NULL;
      //省略若干行代码
      p = &a;//正确使用指针的方式,是解引用指针之前跟一个绝对可用的地址绑定
      if(NULL != p)
      {
       *p = 4;
      }
      p = NULL;//使用完之后,记得将其重新赋值为NULL  
     }
    3、NULL到底是什么?
    (1)、NULL在c/c++中定义为:
     #ifdef  _cplusplus           //定义这个符号就表示当前环境是C++环境
     #define NULL 0               //在C++中NULL就是0
     #else
     #define NULL (void *) 0      //在C中NULL是强制类型转换为void * 的 0
     #endif
    (2)、在C语言中,int *p; p = (int *)0;这是可以的;但是p = 0;这是不可以的,因为类型不相同,p是int *;0是int;
    (3)、所以NULL的实质就是0,然后我们给指针赋初值为NULL,其实就是让指针指向0地址处。为什么这么做:
           原因1:0作为一个特殊地址(我们认为指针指向这里就表示没有被初始化,就表示野指针)
        原因2:地址0在一般的操作系统中都是不可以被访问的,如果程序不检查是否等于NULL就去解引用就会触发段错误。
  • 相关阅读:
    表格文字溢出用省略号代替处理方法
    【Linux】Mysql5.7.12源码编译安装及配置
    【Linux】JDK安装及配置
    [SDOI2017]序列计数
    P1777 帮助_NOI导刊2010提高(03)
    BSGS和EXBSGS
    排列最小值
    三元组[01 Trie计数]
    数学题
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team [单调栈上二分]
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11359178.html
Copyright © 2011-2022 走看看