为什么一定要使用二级指针,而一级为什么就不行呢??
不是说函数中传递指针,在函数中改变指针的值,就是在改变 实参中的数据信息嘛???
额。。。其实吧,上边说的也对,可问题就在这块了。。。问题是,在建立二叉树的过程中,不是改变了形参的值,而是: 改变了形参的指向;而推出该函数后,形参被释放了,那么为形参动态分配的空间,也就没办法释放了,造成了内存泄露问题。。
举个例子吧:
- void get_Vale1(char *pt)
- {
- pt=(char *)malloc(strlen("sx_liang")+1);
- strcpy(pt,"sx_liang");
- }
- void get_Vale2(char **pt)
- {
- *pt=(char *)malloc(strlen("sx_liang")+1);
- strcpy(*pt,"sx_liang");
- }
- int main()
- {
- char *pt=NULL;
- get_Vale1(pt); //看看,这里调用的过程中,传递的是一级指针;
- if( NULL==pt) //额。。。。在这里呢,就会执行if 里边的信息了。。。
- {
- cout<<"pt is NULL"<<endl;
- exit(1);
- }
- else
- cout<<pt<<endl;
- get_Vale2(&pt); //这里呢,传递的是二级指针,结果呢,就输出了“sx_liang";
- if( NULL==pt)
- {
- cout<<"pt is NULL
什么原因呢: 咱开始分析一下:
void get_Vale1(char *M)//这里呢,传递了一个指针,此时,M和 实参 pt 的指向内存的同一块空间,都指向了null;
M=(char *)malloc(strlen("sx_liang")+1); //此时呢,给M的重新开辟了一块空间, 而实参pt 没有变化,还指向NULL;
//就是这里,M 和pt 已经没有联系了,彻底变成了两个指向不同的指针;
strcpy(M,"sx_liang");//退出函数时,因为M是局部变量,在栈中分配的空间,那么M自动销毁,而在堆中为M分配的空间呢,泄露了,没有被释放;是个问题!
void get_Vale2(char **M)//这里呢,传递的是二级指针;此时,M 指向实参,而不是和实参一样指向null;*M 此时才和pt相同,都指向了NULL;注意体会一下;
*M=(char *)malloc(strlen("sx_liang")+1);//在这里呢,*M就是 实参pt ,给*M申请空间,就是在为pt 申请空间;注意体会了;
strcpy(*M,"sx_liang");//推出函数后,M销毁,但是它申请的空间没被释放,但是该空间有pt 指向它,不担心释放问题;
额。。。到这里了,应该就能明白为什么 二叉树的创建过程中 A 办法要使用二级指针了吧。。。。一级指针,每次创建的节点,都没有和头指针root 联系起来,当然就没办法打印了, 而二级呢。。。呵呵。。。就OK了。。。。
就是这样了。。。呵呵。。。