野指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针。而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越了变量的作用范围。
例如如下程序示例。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p = (char *) malloc(100); strcpy(p, "hello"); free(p); if(p != NULL) printf("Not NULL "); return 0; }
输出:
Not Null
上例中,虽然对p执行了free操作,p 所指的内存被释放掉了,但是p所指的地址仍然不变,在后续的判断p是否为NULL时,根本没有起到防错的作用,所以程序输出仍然为Not NULL。
空指针是一个特殊的指针,也是唯一一个对任何指针类型都合法的指针。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的内容。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL,程序里可以写 p = 0 或者 p = NULL,两种写法都把p置为空指针值。C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。
作为一种风格,很多程序员一般不愿意在程序中到处出现未加修饰的 0,所以习惯定义预处理宏 NULL(在 <stdio.h> 和其它几个头文件中)为空指针常数,通常是0 或者 ((void *)0)。希望区别整数0和空指针0的人可以在需要空指针的地方使用 NULL。
通用指针可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
#include <stdio.h> int main() { int n=3, *p; void *gp; gp = &n; p=(int *)gp; printf("%d ",*p); return 0; }
输出:3
转自:http://www.jobcoding.com/basic-knowledge/null-pointer/程序员面试笔试宝典