我是想實現創建二叉樹的,用前序式。但是我在子函數createtree中調用malloc分配內存,創建成功后回到主函數,分配的內存空間沒有了。我在單步調試時創建時可以看見head的地址的,但函數返回main函數時地址就變回void*的了,不是malloc子函數分配的內存在進程結束前不會自動free的嗎?#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);printf("root lchild data = %c\n",head->lchild->data);return 1;}
2 回答

慕后森
TA貢獻1802條經驗 獲得超5個贊
#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; } |
C語言參數傳遞是值傳遞。
你的createtree函數傳入的是main函數里head變量的值,而head在createtree函數體內部卻是個形參,形參的有效范圍僅限于函數內部,所以你在createtree內部改變head的值,實際改變的是形參的值,并沒有改變實參的值,也就是沒有改變main函數里的head變量值。
如果要在函數內部改變外部變量的值,兩種方式:一種是不以參數形式在函數內部使用這個變量,即把這個變量定義成全局變量,直接在函數內部使用;一種是把這個變量的地址作為參數傳進去,然后改變這個地址所在的內存空間,就相當于改變了這個變量的值。
添加回答
舉報
0/150
提交
取消