【问题标题】:Having trouble with Valgrind and implementation of min function for BSTValgrind 遇到问题并为 BST 实现 min 函数
【发布时间】:2020-06-07 16:25:24
【问题描述】:

我用四个函数实现了一个 bst,add、inorderPrint、min 和 max。 min 和 max 应该返回树中的最小/最大值,并删除该节点。允许树不平衡。下面是我的node struct,add函数,min函数的实现,还有valgrind的错误。

Valgrind 错误如下:

==2768== Invalid read of size 8
==2768==    at 0x108C13: removeSmallest (bst.c:43)
==2768==    by 0x108BDC: removeSmallest (bst.c:39)
==2768==    by 0x108945: main (problem2.c:25)
==2768==  Address 0x522d8a8 is 8 bytes inside a block of size 24 free'd
==2768==    at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2768==    by 0x108C0B: removeSmallest (bst.c:42)
==2768==    by 0x108BDC: removeSmallest (bst.c:39)
==2768==    by 0x108945: main (problem2.c:25)
==2768==  Block was alloc'd at
==2768==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2768==    by 0x108A99: add (bst.c:9)
==2768==    by 0x108B08: add (bst.c:15)
==2768==    by 0x108918: main (problem2.c:21)
==2768== 

第 43 行是(*root) = (*root)->right;

第 39 行是return removeSmallest((&(*root)->left));

第 42 行是free(*root);

第 9 行是(*root) = (bst_node *)malloc(sizeof(bst_node));

第 15 行是add(&((*root)->left), word);

这是一个名为 bst.h 的单独文件中的节点结构

typedef struct  bst_node {
    char * data;
    struct bst_node * right;
    struct bst_node * left;
} bst_node ;

这是实现功能的文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"


void add ( bst_node ** root, char * word ) {
if ((*root) == NULL) {
    (*root) = (bst_node *)malloc(sizeof(bst_node));
    (*root)->data = word;
    (*root)->left = NULL;
    (*root)->right = NULL;
} else {
    if (strcmp(word, (*root)->data) < 0) {
        add(&((*root)->left), word);
    } else if (strcmp(word, (*root)->data) > 0) {
        add(&((*root)->right), word);
    }
}
}

void inorder ( bst_node * root ) {

if(root == NULL) {
    return;
}
inorder(root->left);
printf("  %s", root->data);
inorder(root->right);
}

char * removeSmallest (  bst_node ** root ){
char * answer;

if (*root == NULL) {
    return NULL;
} else {
    if ((*root)->left != NULL) {
        return removeSmallest((&(*root)->left));
    } else if ((*root)->right != NULL) {
        answer = (*root)->data;
        free(*root);
        (*root) = (*root)->right;
        return answer;

    } else {
        answer = (*root)->data;
        free((*root));
        *root = NULL;
        return answer;
    }
}
}

【问题讨论】:

    标签: c binary-search-tree valgrind min


    【解决方案1】:

    您正在尝试使用已释放的指针:

    free(*root); (*root) = (*root)->right;

    我觉得应该是这样

    bst_node * new_root = (*root)->right; free(*root); (*root) = new_root;

    【讨论】:

    • 感谢您似乎已经修复了我的 valgrind 错误并且现在可以正确输出!
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2021-06-23
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多