一个二级指针引发的问题
2011-03-25 14:33
323 查看
二级指针也就是指向指针的指针。如:char **p = NULL;。p就是一个二级指针——它是一个指向char *类型变量的指针。
我们来看下面这个小例子,它对吗。
就这短短几行代码,大家一般都会看出有问题,但是代码量一长,难免犯晕,我就晕过一次,不知道你晕过没。没有看出有问题,也不要紧,让过来人告诉你:
问题出在代码的第三行,我们虽然定义了二级指针p,它也的确指向一个char *类型变量[也即*p是char *类型的],那么是不是我们就可以用*p来保存一个字符的地址呢?答案是否定的,因为我们没有为*p分配一个存储char *类型变量的内存空间,就是说p指向一个不存在的地方或者说指向一个不明不白的地方,是野指针,这是很危险的。
所以上面代码我们应该改成这样的
指针是高效的,同时指针也是危险的,一旦由于误用指针而引发的错误是很难发现的,一般编译阶段是查找不到的,运行时才表现出来。而指针的所引发的错误的另一个特点儿是,引发错误发生的地方与表现出错误的地方往往不在一起,所以很难排查。想同时正确而高效的利用指针,就要采用正确的编程规范[如指针在定义时一定要初始化],多实践,多积累。
我们来看下面这个小例子,它对吗。
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++指针小结:由一个问题引发的。。。。。。。。。。。。。。。。。。。
- operator->重载问题总结 让一个对象表现的像一个指针
- 一个CLOSE语句引发的问题
- postgres -- 一个问题引发的事务探究(二)
- *一个二级指针的练习(输入一个数,输出对应的月份)
- 避免使用c/c++指针引发的问题
- 一个粗心的问题引发的思考
- 由一个问题引发的思考
- 一个函数重载问题—指针和整数问题
- 二级常量指针作形参的传参问题
- 关于static指针的一个严重问题
- C语言中的二级指针和二维数组问题
- 【C++】由指针常量和常量指针引发的问题
- 一个知乎问题引发的血案
- 再谈HashMap-由一个实际问题引发的对HashMap设计吐嘈
- 数据库一个空格引发的问题