野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因
- 指针未初始化
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
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;
}
- 指针指向的空间释放
这里放在动态内存开辟的时候讲解,这里可以简单提示一下。
指针指向的空间被释放,指针未赋空。
如果一个指针指向的对象已被删除,那么该指针就成了悬空指针
野指针和悬空指针严格来说没有区别,无非是悬空指针在悬空之前是个“正常指针”,然后指向的空间被free或者delete,然后该指针又没有赋值为NULLL,导致悬空。
如何规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放即使置NULL
- 指针使用之前检查有效性
int main()
{
int *p = NULL;
//....
int a = 10;
p = &a;
if(p != NULL)
{
*p = 20;
}
return 0;
}
指针运算
指针+1,表示向后偏移一个 指针类型的大小,即sizeof(指针类型)
两个指针相减, 指针必须指向一段连续空间,减完之后的结构代表两个指针之间相差(指针类型)元素的个数。
整形(int)指针解引用(*)操作访问4个字节,其他类型访问sizeof(类型)个字节。
指针和数组
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr); //数组名表示的是数组首元素的地址
printf("%p\n", &arr[0]); //此为数组首元素地址
return 0;
/*
int *p = arr;
p+i 就是计算数组arr下标为i的地址。
*/
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
printf("%p, %p\n" , arr ,arr+1); //此时arr+1 跳过的一个元素的地址
printf("%p, %p\n", &arr, &arr+1); //&arr+1 跳过的是一整个数组的地址
}
(char*)类型的指针变量pc指向只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char类型。*