野指针:
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
指针非法访问:
int main()
{int* p;//p没有初始化,就意味着没有明确的指向//一个局部变量不初始化,放的是随机值:0xcccccccc//*p = 10;//非法访问内存了return 0;
}
指针越界访问:
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;for (i = 0; i <= 11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}
指针指向的空间释放:
int* test(void)
{int a = 0;return &a;
}int main()
{int* pi = test();//这个时候pi属于野指针return 0;
}
如何避免野指针
1.指针初始化
2.小心指针越界
3.指针指向空间释放即使置NULL
4.避免返回局部变量的地址
5.指针使用之前检查有效性
int main()
{//int* pi = NULL;//*pi = 100;//errint* pi = NULL;//指针初始化 NULL -> 0if (pi != NULL){*pi = 100;//ok}return 0;
}
指针运算
指针+-整数
#define N_VALUES 5
int main()
{float values[N_VALUES];float* vp;for (vp = &values[0]; vp < &values[N_VALUES];){*vp++ = 0;}return 0;
}
另一种写法
int* p = arr;for (i = 0; i < sz; i++){*(p + i) = 1;}
指针-指针
指针-指针(绝对值)得到的是指针和指针之间的元素的个数
不是所有的指针都能相减,指向同一块空间的指针才能相减(有意义)