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;
}