c语言中的malloc

         今天想去练习一下二叉树的使用的,使用前就必须要创建一个二叉树啊。我用的是前序式的创建方法,都是通过调用子函数createtree来创建一个树(先创建根->左孩子->右孩子),是通过递归的方法的。但是当我测试的时候,每次访问树根的都会出错,原来创建的二叉树根本就没有保存在主函数的head中,我用单步调试发现malloc有问题,没有达到我想要的效果。我是知道malloc在进程结束前都不会自动free掉malloc分配的内存的,那为什么我申请的内存却没有返回到主函数中呢?

#include<stdio.h>
#include<stdlib.h>

typedef struct _tree
{
 char data;
 struct _tree *lchild; 
 struct _tree *rchild;
}bittree;

int createtree(bittree *head)
{
 char data; 
 fscanf(stdin,"%c",&data);
 getchar();

 if('#' == data)
 {
  //*head = NULL;
 }
 else
 {
  head = (bittree*)malloc(sizeof(bittree));
  if(head == NULL) exit(0);
  head->data = data;
  head->lchild = NULL;
  head->rchild = NULL;
  createtree(head->lchild);
  createtree(head->rchild);
 }
 return 1;
 
}

int main()
{
 bittree *head = NULL;
 createtree(head);
 puts("ok!");
 printf("root lchild data = %c\n",head->lchild->data);

 return 1;
 
}

 

        上面是错误的代码的,出错的地方是在函数调用的时候我传的是*head ,我的最大的失误就是以为传的是指针,在子函数中修改什么都能保存的。而忘记了只是修改指针指向的地址单元被修改了才会被保存,而起传递的指针本身被修改时不会被保存的,因为传的指针本身就是相当于值传参,而不是传地址。因此若要想保存在子函数中malloc中的指针就必须要使用一个指针来保存,而在子函数想保存指针当然使用的是指针的指针的(当然也可以将指针返回也是可以的)。因此该代码想要正确的话就必须传的是&head,而不是head这么简单了。正确的代码是

#include<stdio.h>
#include<stdlib.h>
typedef struct _tree
{
char data;
struct _tree *lchild;
struct _tree *rchild;
}bittree;
int createtree(bittree **head)
{
char data;
fscanf (stdin, "%c" ,&data);
getchar ();
if ( '#' != data)
{
*head = (bittree*) malloc ( sizeof (bittree));
if (*head == NULL) exit (0);
(*head)->data = data;
(*head)->lchild = NULL;
(*head)->rchild = NULL;
createtree((*head)->lchild);
createtree((*head)->rchild);
}
return 1;
}
int main()
{
bittree *head = NULL;
createtree(&head); //这里传入head指针的地址,才可以在createtree里改变head的值
printf ( "root lchild data = %c\n" ,head->lchild->data);
return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值