未分配正在释放的 C 指针

标签 c pointers binary-tree

我做了这个 BinaryTree 实现,它工作正常,除了 freeTree() 方法说我正在尝试释放一个未分配的指针。我只是找不到我的逻辑在这里出错的地方。 我不知道如何准确找到它所在的指针。 有什么提示、技巧吗?

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

struct BinaryTree
{
    int data;
struct BinaryTree *left;
struct BinaryTree *right;
};

typedef struct BinaryTree BinaryTree;

FILE *input;
FILE *output;

char dat[99];
int number;

BinaryTree tree;

void add(int data, BinaryTree *tree);
void inorderTraversal(BinaryTree *tree);
void freeTree(BinaryTree *tree);

int main()
{
input = fopen("/Users/sergeymikhaylyuk/Desktop/Program/Tree/input.txt", "r");
output = fopen("/Users/sergeymikhaylyuk/Desktop/Program/Tree/sorted.txt", "w");
while (fgets(dat, sizeof(dat), input))
{
    sscanf(dat, "%i", &number);
    add(number, &tree);
}
inorderTraversal(&tree);
freeTree(&tree);

}

void add(int data, BinaryTree *tree)
{
if (tree->data == 0)
{
    tree->data = data;
}
else
{
    if (tree->data < data && tree->right != NULL)
    {
        add(data, tree->right);
    }
    else if (tree->data < data)
    {
        tree->right = malloc(sizeof(BinaryTree));
        add(data, tree->right);
    }
    else if (tree->data > data && tree->left != NULL)
    {
        add(data, tree->left);
    }
    else if (tree->data > data)
    {
        tree->left = malloc(sizeof(BinaryTree));
        add(data, tree->left);
    }
}
}

void inorderTraversal(BinaryTree *tree)
{
if (tree != NULL)
{
    if (tree->left != NULL)
    {
        inorderTraversal(tree->left);
    }
    fprintf(output, "%i ", tree->data);
    if (tree->right != NULL)
    {
        inorderTraversal(tree->right);
    }
}

}
int i = 1;
void freeTree(BinaryTree *tree)
{
printf("%i ", i);
i++;
if (tree != NULL)
{
    if (tree->left != NULL)
    {
        freeTree(tree->left);
    }
    if (tree->right != NULL)
    {
        freeTree(tree->right);
    }
    free(tree);
}
}

最佳答案

根节点因为这条线在栈上

BinaryTree tree;

所有其他节点都在堆上。

但是您的freeTree 函数释放了包括根在内的所有节点。因此它给出错误 trying to free a pointer which hasn't been malloced error

最简单的解决方法是将上面的更改为

BinaryTree * ptree = malloc(sizeof(BinaryTree));
ptree->data = 0;
ptree->left = NULL;
ptree->right = NULL; 

并将所有使用 &tree 的地方更改为 ptree

例如。

add(number, &tree);

add(number, ptree);

除此之外,您还需要在所有地方 malloc 后将 left 和 right 初始化为 NULL。

例如。之后

tree->right = malloc(sizeof(BinaryTree));

添加

tree->right->data = 0;
tree->right->left = NULL;
tree->right->right = NULL;

关于未分配正在释放的 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224452/

相关文章:

algorithm - 计数陷阱

c - 为什么它在 'c ' 中打印 null

c++ - 至 "if, if, if"或至 "if, else if, else if, else"

c - 如何创建 C 宏来定义函数 typedef?

c - 分配和排序现有结构的指针数组

c - 二叉树 - 删除段错误。

c - 没有 malloc 的指针

c++ - "then in the quote directories"是什么意思?

c++ - C++ 扑克游戏中的数据成员分配

algorithm - 打印二叉树的边界