亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如下,請問不是malloc子函數分配的內存在進程結束前不會自動free的嗎?

如下,請問不是malloc子函數分配的內存在進程結束前不會自動free的嗎?

臨摹微笑 2022-03-18 09:11:21
我是想實現創建二叉樹的,用前序式。但是我在子函數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變量值。

如果要在函數內部改變外部變量的值,兩種方式:一種是不以參數形式在函數內部使用這個變量,即把這個變量定義成全局變量,直接在函數內部使用;一種是把這個變量的地址作為參數傳進去,然后改變這個地址所在的內存空間,就相當于改變了這個變量的值。


查看完整回答
反對 回復 2022-03-23
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

用二級指針, 或將開辟的空間返回

查看完整回答
反對 回復 2022-03-23
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號