指针类型的意义
野指针
如何避免野指针
指针类型的意义
1.不同类型指针决定了指针解引用的时候访问的权限有多大
2 指针类型决定了指针走一步能走多远,也就是步长
如图上,这里是字符类型指针解引用一次只能访问一个字节,
那如果是int*的整形指针,则会把11,22,33,44这四个字节都变成0,
说明整形指针一下可以访问四个字节
指针走一步能走多远
如图上,为什么产生了区别,是因为p和pc的类型不相同
字符指针+1相当于跳过一个字符,跳过一个字符就相当于+1嘛
如果是整形指针的话+1相当于跳过一个整形,如果跳过一个整形相当于跳过四个字节
整形指针跳过四个字节,看下图
野指针
概念:指针就是指针指向的位置是不可知的{随机、不正确、没有限制的}
造成野指针的原因有哪些?
1 指针未初始化
2 指针越界
3 指针指向的空间释放
1 指针未初始化 ,如图上
因为p是局部指针变量,局部变量不初始化默认随机值,也就是p指向了未知的内存空间
这时候解引用p,就属于非法访问内存空间,p就为野指针
2 指针越界
arr整型数组,有10个元素,初始化元素值为0,arr数组名表示首元素地址传给了指针p,
通过对指针解引用改变数组元素值,当i=10时,此时*p访问的内存空间不在数组有效范围内,此时*p就属于非
法访问内存空间,p为野指针
3 指针指向的空间释放
这时候这块空间已经还给操作系统了,在通过*p=20去访问这块空间的时候,p就是野指针了,
属于非法访问内存空间.这里忘记写上*p=20了
原码是
#include<stdio.h>
int *test()
{
int a=10;
return &a;
}
int main()
{
int *p=test;
*p=20;
}
如何避免野指针
1 指针初始化
2 小心指针越界
3 指针指向的空间被释放需及时置NULL
4 指针使用前检查有效性
1 指针初始化不知道初始成什么的时候可以初始化为NULL
NULL是什么
要么是0,要么是把0强制类型转换成void *指针类型,但它本质上还是个0
跟int a=0一样的意思
2 c语言本身是不会检查数组的越界行为的,
3 指针指向的空间被释放,及时置空
当p这个指针指向的空间已经不属于我的了,要及时把p这个指针变量置空.p=NULL.这也可以预防野指针
4 指针使用前检查有效性
这样的话,指针要不就是空指针,要不就是指针指向的空间是有效的