C 我需要在BinaryTree中释放根还是数据?

C 我需要在BinaryTree中释放根还是数据?,c,pointers,malloc,binary-tree,C,Pointers,Malloc,Binary Tree,我有个问题。。。如果我有这样一个二进制树: typedef struct { char* text; char* line; struct Node* left; struct Node* right; }Node 并具有启动功能: Node *start(Node* ptr) { if(ptr == NULL) { ptr = (Node*)malloc(sizeof(Node)); ptr->text = "some text"; ptr-&

我有个问题。。。如果我有这样一个二进制树:

typedef struct
{
   char* text;
   char* line;
   struct Node* left;
   struct Node* right;
}Node
并具有启动功能:

Node *start(Node* ptr)
{
if(ptr == NULL)
{
 ptr = (Node*)malloc(sizeof(Node));
    ptr->text = "some text";
    ptr->line = "another text";
    ptr->left = NULL;
    ptr->right = NULL;
}
return (ptr);
}
若根不是空的,在这里我必须给出我的文本和行动态内存,那个么在二进制树中添加左子元素的函数

  Node* addNode(Node* ptr)
  {
    if(ptr != NULL)
    {
    Node* leftNode = (Node*)malloc(sizeof(zeiger));
    char* text = (char*) malloc(100*sizeof(char));
    char* line = (char*) malloc(100*sizeof(char));

    line = "some text 2";
    text = "another text";
    if(leftNode !=NULL)
    {
        leftNode->text = text;
        leftNode->line = line;
        leftNode->right = NULL;
        ptr->left = leftNode;
    }
    return leftNode;
}
return ptr;
}

现在的问题是,我想释放树中的所有内容,所以我有一个这样的函数,如果left或right或root不为NULL,就调用它自己。所以我看到了一些代码,我应该释放根而不是数据

void freeTree(Node* root)
{
  while(1)
  {
   if(root == NULL)
  {
  break;
}
else if (root->left != NULL)
{
  freeTree(root->left);
  root->left = NULL;
}
else if (root->right) {
        freeTree(root->right);
  root->right = NULL;
}
else
  {
  free(root);
  }
 }
}
Main.c

int main(int argc, char const *argv[]) {

Node* root = NULL;
root = start(root);
root = addNode(root);
freeTree(root);
return 0;
}

你不应该释放你没有
malloc
的内存

这里,第一个节点的指针指向字符串文本。你不应该对它们调用
free()

您还应该在初始节点中分配内存,然后尝试复制该字符串文本。现在每个节点都是相似的

现在释放每个节点的内存。先做哪个节点?后序遍历就是其中之一。首先释放子级,然后释放父级,否则将导致内存泄漏

void freeTree(Node *root){
   if( root ){
     freeTree(root->left);
     freeTree(root->right);
     free(root->text); // root->text was allocated calling malloc
     free(root->line); // same for root->line
     free(root);
   }
}


根->文本是通过调用malloc分配的-您必须动态分配才能调用
free
。在代码中,初始节点的
文本
指向字符串文本。您需要按照答案中所述的正确方式执行-(分配-并将字符串复制到新分配的内存中)。

您不应该释放没有释放的内存
malloc

这里,第一个节点的指针指向字符串文本。你不应该对它们调用
free()

您还应该在初始节点中分配内存,然后尝试复制该字符串文本。现在每个节点都是相似的

现在释放每个节点的内存。先做哪个节点?后序遍历就是其中之一。首先释放子级,然后释放父级,否则将导致内存泄漏

void freeTree(Node *root){
   if( root ){
     freeTree(root->left);
     freeTree(root->right);
     free(root->text); // root->text was allocated calling malloc
     free(root->line); // same for root->line
     free(root);
   }
}


根->文本是通过调用malloc分配的-您必须动态分配才能调用
free
。在代码中,初始节点的
文本
指向字符串文本。您需要按照答案中所述的正确方式进行操作-(分配-并将字符串复制到新分配的内存中)。

您必须释放所有内容,所有节点。如果你自己分配内存,你必须自己释放它,否则它就是内存泄漏,特别是如果你只释放根节点,那么子节点本身就不会被某种魔法释放。
char*line=(char*)malloc(100*sizeof(char))
line=“一些文本2”是内存泄漏。由于您立即丢失了指向已分配内存的指针,您将永远无法释放它。@Lanting在将其解析为树后是否应释放它?这是关于所有权的问题,如果节点“拥有”文本行,则每次重新分配指针时,都应释放旧值。但是,您的节点不拥有字符串常量。不能在指向字符串常量的指针上调用free。如果希望节点“拥有”字符串,则应将其
strncpy
放入刚才分配的缓冲区。你必须释放一切,所有节点。如果你自己分配内存,你必须自己释放它,否则它就是内存泄漏,特别是如果你只释放根节点,那么子节点本身就不会被某种魔法释放。
char*line=(char*)malloc(100*sizeof(char))
line=“一些文本2”是内存泄漏。由于您立即丢失了指向已分配内存的指针,您将永远无法释放它。@Lanting在将其解析为树后是否应释放它?这是关于所有权的问题,如果节点“拥有”文本行,则每次重新分配指针时,都应释放旧值。但是,您的节点不拥有字符串常量。不能在指向字符串常量的指针上调用free。如果希望节点“拥有”字符串,则应将其
strncpy
放入刚才分配的缓冲区。“根->文本被分配调用malloc”当然只有在兰廷在评论中提到的错误得到纠正时才是正确的above@IngoLeonhardt.:是的,当然……第一行是这么说的。我一到家就会明确地提到。谢谢请不要介意。@IngoLeonhardt.:检查一下。。我想应该更明确一些。“根->文本被分配给调用malloc”当然只有在Lanting在评论中提到的错误得到纠正时才是正确的above@IngoLeonhardt.:是的,当然……第一行是这么说的。我一到家就会明确地提到。谢谢请不要介意。@IngoLeonhardt:检查一下……我想应该更清楚些。