C++ 指针,如悬空、空、空值和未定义的指针

C++ 指针,如悬空、空、空值和未定义的指针

悬空指针

悬空指针是指向已删除(或释放)内存位置的指针。指针可以通过以下三种方式成为悬空指针。

1. 内存释放

C++代码

// 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. 函数调用

C++代码

// 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
    std::cout << *p;

    return 0;
}

C 代码

// 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不会变得悬空)。

C++代码

// The pointer pointing to local variable doesn't
// become dangling when local variable is static.

#include 
using namespace std;

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.
    cout << *p;

    return 0;
}

输出:

5

3. 变量超出范围

void main()
{
   int *ptr;
   .....
   .....
   {
       int ch;
       ptr = &ch
   } 
   .....   
   // Here ptr is dangling pointer
}

空指针

空指针是一个特定的指针类型 – void * – 指向存储中未指定数据位置的指针。该类型被称为void。基本上,它指向的数据可以是任何类型。如果我们将char数据类型的地址赋给一个空指针,它将变成一个char指针;将int数据类型的地址赋给一个空指针,它将变成一个int指针,依此类推。因为任何指针类型都可以转换为一个空指针,所以它可以指向任何值。

重要注意事项

  • 不可能对空指针进行解引用操作。然而,可以通过将空指针进行类型转换来进行解引用操作。
  • 由于缺少具体的值和大小,不能对空指针进行指针运算。

C++代码

#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

空指针

C++ 代码

#include 
using namespace std;

int main()
{
    // Null Pointer
    int *ptr = NULL;

    cout << "The value of ptr is " << ptr;
    return 0;
}

输出:

The value of ptr is (nil)

重要考虑因素

  • 未初始化指针 vs. NULL – 未初始化的指针存储一个未定义的值。空指针存储一个被定义为不是任何成员或对象的有效地址的值。
  • NULL vs. 空指针 – 一个值是空指针,而一个空指针是一种类型。

野指针

野指针是指没有被初始化为任何内容(甚至不是NULL)。指针可能被设置为一个非空的垃圾值,它不是一个有效的地址。

C++ 代码

int main()
{
    int *p; /* wild pointer */

    int x = 10;

    // p is not a wild pointer now
    p = &x

    return 0;
}

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程