野指针:
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
指针非法访问:
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;//err
int* pi = NULL;//指针初始化 NULL -> 0
if (pi != NULL)
{
*pi = 100;//ok
}
return 0;
}
指针运算
指针+-整数
cs
#define N_VALUES 5
int main()
{
float values[N_VALUES];
float* vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}
return 0;
}

另一种写法
cs
int* p = arr;
for (i = 0; i < sz; i++)
{
*(p + i) = 1;
}
指针-指针
指针-指针(绝对值)得到的是指针和指针之间的元素的个数
不是所有的指针都能相减,指向同一块空间的指针才能相减(有意义)

