一个二级指针引发的问题

二级指针也就是指向指针的指针。如:char **p = NULL;。p就是一个二级指针——它是一个指向char *类型变量的指针。

我们来看下面这个小例子,它对吗。

char **p; char c = 'a'; *p = &c;

就这短短几行代码,大家一般都会看出有问题,但是代码量一长,难免犯晕,我就晕过一次,不知道你晕过没。没有看出有问题,也不要紧,让过来人告诉你:

问题出在代码的第三行,我们虽然定义了二级指针p,它也的确指向一个char *类型变量[也即*p是char *类型的],那么是不是我们就可以用*p来保存一个字符的地址呢?答案是否定的,因为我们没有为*p分配一个存储char *类型变量的内存空间,就是说p指向一个不存在的地方或者说指向一个不明不白的地方,是野指针,这是很危险的。

所以上面代码我们应该改成这样的
char **p = NULL;//初始化你的指针,如果定义的时候还没有具体确定指向谁,就用NULL初始化 char c = 'a'; p = new char*; if(p != NULL)//检测内存分配是否成功 *p = &c; //其它语句 delete p;//释放在堆上分配的内存空间,以免造成内存泄露 p = NULL;//避免p成为野指针

指针是高效的,同时指针也是危险的,一旦由于误用指针而引发的错误是很难发现的,一般编译阶段是查找不到的,运行时才表现出来。而指针的所引发的错误的另一个特点儿是,引发错误发生的地方与表现出错误的地方往往不在一起,所以很难排查。想同时正确而高效的利用指针,就要采用正确的编程规范[如指针在定义时一定要初始化],多实践,多积累。


你可能感兴趣的:(c/c++)