📜  悬空,无效,空指针和野生指针

📅  最后修改于: 2021-05-30 12:54:18             🧑  作者: Mango

悬空指针

指向已删除(或释放)的内存位置的指针称为悬空指针。指针用作悬空指针有三种不同的方式

  1. 内存分配
    // Deallocating a memory pointed by ptr causes
    // dangling pointer
    #include 
    #include 
    int main()
    {
        int *ptr = (int *)malloc(sizeof(int));
      
        // After below free call, ptr becomes a 
        // dangling pointer
        free(ptr); 
          
        // No more a dangling pointer
        ptr = NULL;
    }
    
  2. 函数调用
    // The pointer pointing to local variable becomes
    // dangling when local variable is not static.
    #include
      
    int *fun()
    {
        // x is local variable and goes out of
        // scope after an execution of fun() is
        // over.
        int x = 5;
      
        return &x;
    }
      
    // Driver Code
    int main()
    {
        int *p = fun();
        fflush(stdin);
      
        // p points to something which is not
        // valid anymore
        printf("%d", *p);
        return 0;
    }
    

    输出:

    A garbage Address
    

    如果x是静态变量,则不会出现上述问题(或p不会悬空)。

    // The pointer pointing to local variable doesn't
    // become dangling when local variable is static.
    #include
      
    int *fun()
    {
        // x now has scope throughout the program
        static int x = 5;
      
        return &x;
    }
      
    int main()
    {
        int *p = fun();
        fflush(stdin);
          
        // Not a dangling pointer as it points
        // to static variable.
        printf("%d",*p);
    }
    

    输出:

    5
  3. 变量超出范围
    void main()
    {
       int *ptr;
       .....
       .....
       {
           int ch;
           ptr = &ch;
       } 
       .....   
       // Here ptr is dangling pointer
    }
    

虚空指针

无效指针是一种特定的指针类型– void * –指向存储中某个数据位置的指针,它没有任何特定的类型。空是指类型。基本上,它指向的数据类型可以是任何类型。如果我们将char数据类型的地址分配给void指针,它将成为char指针,如果是int数据类型,则将成为int指针,依此类推。任何指针类型都可以转换为空指针,因此它可以指向任何值。
重要事项

  1. void指针不能被取消引用。但是,可以使用类型转换void指针来完成
  2. 由于缺少具体的值和大小,因此无法对void指针进行指针算术运算。

例子:

#include
  
int main()
{
    int x = 4;
    float y = 5.5;
      
    //A void pointer
    void *ptr;
    ptr = &x;
  
    // (int*)ptr - does type casting of void 
    // *((int*)ptr) dereferences the typecasted 
    // void pointer variable.
    printf("Integer variable is = %d", *( (int*) ptr) );
  
    // void pointer is now float
    ptr = &y; 
    printf("\nFloat variable is= %f", *( (float*) ptr) );
  
    return 0;
}

输出:

Integer variable is = 4
Float variable is= 5.500000

有关详细信息,请参见空指针文章。

空指针

NULL指针是没有指向任何内容的指针。如果没有将地址分配给指针的情况,则可以简单地使用NULL。

#include 
int main()
{
    // Null Pointer
    int *ptr = NULL;
      
    printf("The value of ptr is %p", ptr);
    return 0;
}

输出 :

The value of ptr is (nil)

重要事项

  1. NULL与未初始化的指针–未初始化的指针存储未定义的值。空指针存储定义的值,但是环境定义的值不是任何成员或对象的有效地址。
  2. NULL vs空指针–空指针是一个值,而空指针是一个类型

野指针

尚未初始化为任何值(甚至不是NULL)的指针称为野生指针。可以将指针初始化为一个非NULL垃圾值,该值可能不是有效地址。

int main()
{
    int *p;  /* wild pointer */
  
    int x = 10;
  
    // p is not a wild pointer now
    p = &x;
  
    return 0;
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”