如何安全的使用指针?

目录:

         指针安全使用的两条规则

         空指针

        安全使用指针的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<stdio.h>
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<stdio.h>
void min_max(int* p,int len,int* pmax,int* pmin){
	int maxnum=p[0];
	int minnum=p[0];
	for(int i=1;i<len;i++){
		if(p[i]>maxnum)
			maxnum=p[i];
		if(p[i]<minnum)
			minnum=p[i];
	}
	if(pmax){//判断是否为空指针 
		*pmax=maxnum;
	}
	if(pmin){//判断是否为空指针 
		*pmin=minnum;
	}
} 
int main(){
	int arr[10]={8,2,3,45,6,7,87,45,53,235};
	int a=0;
	min_max(arr,10,&a,0);//应用广泛,当用户不需要最小值时,传入空指针 
	printf("%d \n",a);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhao2chen3/article/details/85003245