首先养成指针初始化的良好编程习惯: int *p = NULL; 严禁int *p;
一、指针指向不可访问(如内核空间)的地址,结果是触发段错误。
对于未初始化的指针,其指向的地址是不确定的,若指向非法内存,并对非法内存的读取,其后果是不可预料的。
二、指针指向了一个可用的,无关紧要的地址空间,此时运行结果不会出现段错误。这种情况下会掩盖你的程序错误,让你以为程序没有问题,其实问题也是很严重的。
若上述代码未出现段错误,这是因为未初始化的指针所指向的地址是随机的,若刚好指向了一个可用的、无关紧要的地址就会编译通过。这种情况可能会在将来的代码中发生一些未知性的错误,排查相当困难。
三、指针数组越界造成离奇错误。int a[3] = {1, 2, 3};数组中使用的int *p = a[3];此指针即为野指针。
若对野指针p所指向的地址进行读写,其可能是某些非法区域或者存储其他变量值,擅自更改会影响该变量值,进而产生离奇错误。
**************************如何避免野指针**********************
1、定义指针时,同事初始化为NULL。
2、在指针使用前,将其赋值绑定给一个可用的地址空间。
3、在指针解引用之前,先去判断这个指针是否为NULL。
4、避免指针越界。
5、在一个范围内(如在if语句范围下使用该语句之外定义的指针)指针使用完后,将其赋值为NULL,不能将if下定义的变量地址用指针带出if语句,因为范围内定义的变量只能在该范围内使用,避免返回局部变量的地址。