zoukankan      html  css  js  c++  java
  • NULL指针 Void* 和野指针

    在C和C++的语言中常常有这几个概念:

    NULL指针、空指针、Void *指针、野指针(Wild Pointer)甚至垂悬指针(Dangling Pointer)。

    1.NULL指针,一般用于指向一个预留的值,不一定是0,通常是没有真正意义上的实体。被称作空指针。所以任何对象或者函数的地址都不可能是空指针。

    常用于

    初始化一个指针 如 int *ptr = NULL;

    或者判断内存分配是否失败,if(NULL == ptr) ……

    或者一个指针被delete或者free之后,

    char *dp = malloc(A_CONST);
    free(dp);
    dp = NULL;

    http://en.wikipedia.org/wiki/Null_pointer

    有宏定义为

    #ifndef NULL
    #ifdef __cplusplus
    #define NULL    0
    #else
    #define NULL    ((void *)0)
    #endif
    #endif

    在C++里被定义为 0;没有定义__cplusplus的话,指向一个值为0的 void型指针。 

     2.Void * 定义一个指针,是确确实实存在地址的一个指针,仅仅是没有指定具体的形如int *, byte *, float *等类型。所以是指针类型为空的指针。

    3.野指针 Wild Pointer

    一般产生方式:

    定义一个指针,没有初始化,如:

    int f(int i)
    {
        char *dp;    /* dp is a wild pointer */
        static char *scp;  /* scp is not a wild pointer:
                            * static variables are initialized to 0
                            * at start and retain their values from
                            * the last call afterwards.
                            * Using this feature may be considered bad
                            * style if not commented */
    }

    更多说明参考http://en.wikipedia.org/wiki/Wild_pointer

    4. 垂悬指针Dangling Pointer

    国内基本上将垂悬指针和野指针等同一个概念了。

    产生原因:地址失效

    如,访问有效期结束,导致,地址失效

    {
       char *dp = NULL;
       /* ... */
       {
           char c;
           dp = &c;
       } /* c falls out of scope */
         /* dp is now a dangling pointer */
    }

    地址被释放,导致地址失效

    int f(int i)
    {
        char *p = NULL, *p2;
        p = (char *)malloc(1000);    /* get a chunk */
        p2 = p;              /* copy the pointer */
        /* use the chunk here */
        safefree((void **)&p);       /* safety freeing; does not affect p2 variable */
        safefree((void **)&p);       /* this second call won't fail */
        char c = *p2;       /* p2 is still a dangling pointer, so this is undefined behavior. */
        return i + c;
    }

    更多说明参考http://en.wikipedia.org/wiki/Dangling_pointer  在wiki上和Wild Pointer在同一条。

  • 相关阅读:
    BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
    bzoj 1084
    bzoj 2763
    bzoj 1003
    bzoj 1858
    codevs 1296
    cf 438D
    vijos 1083
    codevs 3303
    bzoj 1296
  • 原文地址:https://www.cnblogs.com/zzugyl/p/3333125.html
Copyright © 2011-2022 走看看