一. 野指针
所谓的野指针指的是一个指针变量指向了不可使用的内存空间。
产生野指针三个原因:
(1)指针变量创建时候没有被初始化:任何指针变量在创建的时候,不会自动成为NULL指针,它的默认值是随机的,因此该指针就会成为一个野指针,可能指向一块不可使用的内存空间。
例如char *p; 这样创建一个指针p,指向一个随机的内存地址空间
所以指针在创建的时候要被初始化,可以讲其初始化为NULL,或指向合法的内存空间
比如 char *p = NULL ; 或 char *p = new char; //这个时候p就不会是一个野指针
(2)delete或free指针之后没有把指针设置为NULL:delete和free只是把指针所指的内存空间释放掉,而没有对指针本身进行释放。
比如char *p = new char; delete p; //这时候指针p所指的内存空间被释放,但是指针p本身不为空,但是指针p所指向的内存空间已经不能使用,造成了野指针。正确的做法是及时的把指针p赋值为NULL
例如下面这个程序
char *p = (char *)malloc(100);
strcpy(p, "hello");
free(p);
if(p != NULL){
printf("not NULL\n");
}
结果输出”not NULL“,验证上面的结论,应该在free之后马上把p = NULL。
(3)指针操作超过了指向内存空间的作用范围:当指针越界之后也会变成一个野指针
二. 空指针
空指针是一种特殊的指针,表示当前这个指针变量处于空闲状态,没有指向任何有意义的内存空间。
C++中用NULL来表示空指针,NULL是一个符号常量值为0。
三. 无类型指针
无类型指针指的是void *这种指针,表示可以指向任何数据类型。
比如
int n = 3;
int *p = NULL; //说明指针p此时空闲,没有指向任何有意义的内存空间,空指针
void *gp = &n; //正确,无类型指针gp指向整型变量n
int *m=gp; //错误,不能用一个确定类型的指针指向无类型指针
p = (int *)gp; //把无类型指针转换为整型指针
printf("%d\n", *p);
结果输出3,说明无类型指针可以转换成任何数据类型的指针。