空指针、野指针、通用指针、垂悬指针

1,086 阅读2分钟

空指针、野指针、通用指针、垂悬指针的定义

  • 空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。
  • 野指针:野指针也就是指向不可用内存区域的指针(比如:在首次使用之前没有进行必要的初始化;垂悬指针也是可以算是野指针的一种)。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
  • 通用指针(void 指针) :通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为 void 指针。
  • 悬垂指针(迷途指针) :指向曾经存在的对象,但该对象已经不再存在了,此类指针称为悬垂指针。结果未定义,往往导致程序错误,而且难以检测。
// 垂悬指针演示
#include <iostream>
#include <windows.h>
using namespace std;
 
int *p = NULL;
 
void fun(){
    int i = 10;
    p = &i;
}
 
int main()
{
    fun();
    cout << "*p = " << *p << endl;
    Sleep(1000);
    cout << "一秒钟后,fun()中的i变量的存储空间被释放, p所指对象的值为:" << endl << "*p = " << *p << endl;
    return 0;
}
//输出为:
//*p = 10
//一秒钟后,fun()中的i变量的存储空间被释放, p所指对象的值为:
//*p = 1000

野指针的成因主要有两种:

  1. 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
  2. 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

相关题目:

  1. 空指针是指()

A. 所指向的空间位置是未存放任何数据的指针.
B. 所指向的空间位置存放着数据0的指针.
C. 所指向的空间位置可用于存放任何类型数据的指针.
D. 所指向的空间位置就是地址0的指针.

答案: D

解析如下:
空指针即p=NULL,NULL就代表系统的0地址单元.