指针安全使用的两条规则
空指针
安全使用指针的4条注意事项
一、指针不可以乱用,否则会导致程序崩溃。在使用指针之前,一定要弄清楚两个问题:
(一)这个指针指向了哪儿;
(二)这个指针指向的那个地方是否有效?(能否访问)
二、就目前来说,指针只允许指向两个地方:
(1)指向变量和数组
int n;
int* p1=&n;//p1指向的内存:一个变量
int arr[4];
int* p2=arr;//p2指向的内存:一个数组
(2)指向0
int *p=0;//一个空指针
当一个指针未赋值时,会指向一个随机的内存地址,称为“野指针”,wild pointer
int *p;//这个指针指向了一个莫名其妙的地方
printf("%d\n",*p);//立即崩溃
三、空指针
值为0的指针,称为空指针。
int* p=0;
当指针为空的时候,不能使用*(取值)操作。
int *p=0;
printf("%d \n",*p);//错误,当指针为空时,不能使用*操作
但空指针是程序员可以接受的一种情况,只需加一个if判断就能解决。
if(p)
printf("%d \n",*p);
四、安全使用指针
(1)杜绝野指针
int *p;//错,杜绝野指针
(2)严防数组越界
int arr[4];
int* p=arr;
p+=4;
*p=12;//已经越界!但不容易察觉
(3)检查变量是否已经失效(如果指针指向的目标的生命周期已经终结【失效】,则该指针也失效)因此,指向全局变量的指针,安全性相对较高,因为它的生命周期永恒,这一块内存总是有效的。
实例1:
int main(){
int* p=0;
if(1){
int a=10;//a生效
p=&a;//p指向a
}//a失效
*p=11;//p指向了一个无效的位置
return 0;
}
实例2:
#include
int* test(){
int a=0;
return &a;
}
int main(){
int *p=test();//p指向变量a,a是局部变量,此时已失效
*p=11;
return 0;
}
(4)正确判断空指针(空指针的应用很广,当用户不需要此值时,便传入空指针即可)
int* p=0;//设为空指针,这是一个好习惯
if(p){//在对p取值之前要判断指针是否为空
printf("%d",*p);
}
实例:
#include
void min_max(int* p,int len,int* pmax,int* pmin){
int maxnum=p[0];
int minnum=p[0];
for(int i=1;imaxnum)
maxnum=p[i];
if(p[i]