1.没有初始化
在定义指针时如果没有确定指向的对象,必须把指针指向NULL。
int main()
{
int* P;//p是一个局部的指针变量,如果不初始化,默认指向随机值
*P = 10;//此时非法访问内存
}
2.指针越界访问
int main()
{
int arr[10]={0};
int *p=arr;
int i =0;
for (i=0; i<=10; i++)
{
*(p++)=i;
}
}
当超过十次循环之后,指针p指向的范围超过数组arr的范围,导致越界访问。
3.指针指向的空间释放
int* test()
{
int a = 10;
return &a;//返回一个int型的指针变量。
}
int main()
{
int *P = test()
*p = 20;
return 0;
}
main函数中调用test会返回a的指针变量,但是在a是局部变量,在test()函数执行过后被销毁,此时*p指向不明,导致非法访问。
4.如何避免
1.指针初始化
int a = 10;
int *P = &a;
int* p = NULL;//当指针不知道初始化为什么的时候指向为空。
2.小心指针越界
3.当指针释放时及时指向为空
4使用前检查指针有效性
if(p!=NULL)
{
return 0;
}