野指针的定义:随机指向一块内存的指针称为野指针。(成因:因为在计算机中,内存的分配由操作系统来管理,要使用内存需要先向操作系统申请,系统分配后才可以使用,而野指针的内存空间是随机分配的,属于非法访问内存。)
野指针的危害:容易导致内存泄漏,即失去对内存的控制导致内存的浪费,在程序运行时由于非法访问内存会产生段错误,但是野指针不一定每次都产生段错误,因为有的时候系统分配给野指针的内存是其他变量申请过的,被分配过的,此时野指针使用该内存就会被当做合法使用内存。
野指针的规避:
想要规避野指针,要养成一些良好的编码习惯:
1、当一个指针没有指向时一定要置为空,即指向NULL,因为NULL是一个零地址,系统规定不可以对零地址进行操作。其实置为空是无法彻底避免野指针的,置为空只是提醒编程者该指针是野指针,不可以对其进行赋值或其他操作。
2、当要往一个指针指向的空间赋值时,一定要检查是否已经给该指针分配空间,一定要确保已经分配空间。分配空间可以用malloc函数,例如int* p = malloc(size of (int)),这里要说明一下为什么赋值的不是int数据类型的字节长度4。因为在不同平台上,整型的字节长度可能不一样,如果分配的是4,那么当程序在其他平台执行时,整形数据长度可能就不是四个字节,会带来不必要的麻烦。以这种方式写可以保证无论在什么平台分配的都是整型数据的字节长度,从而提高了代码的移植性。
3、当给一个指针分配了空间后一定要检查是否分配成功,因为malloc并不一定百分之百生效,可以执行如下程序进行检查:
if(p == NULL)
{
printf("malloc error!\n");
exit(1);//跳出整个程序
}
4、malloc分配空间成功后再使用这块空间之前要进行该空间的初始化,因为如果不进行初始化可能会有之前的垃圾数据残留,影响程序。可以用memset(p,0,sizeof(int));memset会将p指向的空间都置为0。
5、使用完之后要用free(p)释放内存空间。
6、释放空间之后一定要再次将p置为空,否则p会再次成为野指针。