野指针概念
野指针就是指指针指向的位置是不可知的.
野指针的主要形式
1 指针未初始化,局部指针变量未初始化,默认为随机值
#include<stdio.h>
int main() {
int* p;//指针变量未初始化
*p = 0;
getchar();
return 0;
}
2 指针越界访问
#include<stdio.h>
int main() {
int arr[10] = { 0 };
int i = 0;
int* p = arr;
for (i = 0; i < 12; i++) {
//*p = i;
//p++;
*p++ = i;
}
return 0;
}
3 指针指向的空间释放
#include<stdio.h>
int* point() {
int a = 10;
return &a;
}
int main() {
int* p = point();
*p = 20;
return 0;
}
当point函数执行的时候a才申请了一段4个字节的空间,当返回&a后,函数执行完毕,释放了a所申请的空间,这个时候,p所拿到的a的地址就是被释放的空间,内部也不确定是什么了,再去修改这个空间的值的时候,可能会导致严重的后果。
如何规避野指针
1 指针初始化
#include<stdio.h>
int main() {
int a = 0;
int* p = &a;//初始化
return 0;
}
#include<stdio.h>
int main() {
int* p = NULL;//初始化
return 0;
}
2 小心指针越界
3 指针指向的空间释放及时置NULL
#include<stdio.h>
int main() {
int a = 0;
int* p = &a;
*p = 10;
int* p = NULL;//不打算再使用p指针后,p指向的空间释放及时置NULL
return 0;
}
4 指针使用前检查有效性
#include<stdio.h>
int main() {
int a = 0;
int* p = &a;
*p = 10;
int* p = NULL;//
if (p != NULL) {//判断指针有效性
//......
}
return 0;
}