无家可归的野指针

野指针

首先了解定义指针的三步骤:
第一步:定义指针变量
int *p;
第二步:绑定
p=&a //让指针指向a变量的地址
或者也可以这样绑定:p=(int *)4 //让指针指向地址为4的变量
第三步:解引用
*p=100; //表示变量本身

然而野指针可以简单的理解就是指针地址是随机的,“瞎乱指向的”。
先看一段简单的代码:

include<stdio.h>
int main(void)
{
	//定义指针变量
	int *p;
	//解引用
	*p=100;
}

上面代码运行结果出错:Sgmentation fault
原因分析:因为代码中没有进行指针定义的第二步‘’绑定‘’,得之成为了“野指针”,在编译器中中,指针变量的的地址随机的,可能会把已经栈内存中“很脏”的内存对应的地址作为指针变量的地址。(这里不理解“很脏”得内存可以查看内存那点事儿之“管理内存”——数组、结构体、栈、堆
所以在解引用之前一定要给指针初始化,确保指针指向一个确定的地址,不能让随意指向其他地址。

常规的做法是:
第一点:定义指针时,同时初始化为NULL
第二点:在指针解引用之前,先去判断这个指针是不是NULL
第三点:指针使用完之后,将其赋值为NULL
第四点:在指针使用之前,将其赋值绑定给一个可用地址空间

include<stdio.h>
int main(void)
{
	int a=100;
	//定义指针变量同时初始化NULL
	int *p=NULL;
	//判断指针是不是NULL
	ifNULL=p)
	{
		P=&a;
	}
	*p=a;
	//用完指针再将其赋值NLL
	P=NULL;

看到这里有人就会问了,NULL到底是“何方神圣”?
NULL本质就是0;

//NULL在C/C++中定义为:
#ifdef _cplusplus			// 定义这个符号就表示当前是C++环境
#define NULL 0				// 在C++中NULL就是0
#else
#define NULL (void *)0		// 在C中NULL是强制类型转换为void *的0
#endif

那么就有人又问了:为什么偏偏要指向0地址呢?就不怕0地址也是“脏的”吗?
答案肯定是不可以:原因一:0地址处作为一个特殊地址(我们认为指针指向这里就表示指针没有被初始化,就表示是野指针)。
原因二:一般操作系统不会访问0地址,所以0地址干净着呢!

买一送一(哈哈哈哈哈):上面代码中为什么 if(NULL!=p)而不写成 if(p!=NULL)?
这只是程序员的习惯,好习惯!!!当我们在写p2时很容易写成p=2;但是如果我们写成2p就不容易写错成2=p了,哈哈哈哈!是不是很实用。

!!!如果错误,欢迎纠正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu Junwu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值