野指针
首先了解定义指针的三步骤:
第一步:定义指针变量
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
if(NULL!=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了,哈哈哈哈!是不是很实用。
!!!如果错误,欢迎纠正