当前位置: 首页 > 知识库问答 >
问题:

在使用Valgrind和实现BST的min功能时遇到问题

彭鸿文
2023-03-14

我实现了具有四个函数的bst,add,inorderPrint,min和max。最小值和最大值应该返回树中的最小/最大值,并删除该节点。树允许不平衡。下面是我的节点结构、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)-

第39行是返回删除最小的((

第 42 行是自由的(*根);

第9行是< code >(* root)=(BST _ node *)malloc(sizeof(BST _ node));

第15行是add(

这是名为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;
    }
}
}

共有1个答案

南宫胡媚
2023-03-14

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

< code > free(* root);(*root) = (*root)-

我想这应该是

bst_node*new_root=(*root)-

 类似资料:
  • 我已经看到了一些关于寻找最小索引的问题。在这个相关的问题上有一个解决方案,它使用2个内置函数,,然后。这种方法的问题是它会对整个列表进行两次检查。是否有任何单个内置函数用于最小/最大索引?

  • 我得到了一个泛型二分搜索树类,其声明如下: 还有: 找不到适合方法不适用(实际参数列表和正式参数列表长度不同)方法不适用(实际参数无法通过方法调用转换转换为),其中、是类型变量: 从错误消息告诉我的情况来看,由于我的值没有扩展,所以我无法将它们用作键。如果我是对的,我如何在不改变给定的类(可能是强制转换)的情况下绕过这个问题?

  • 我想使用JAX-RS实现Subresource。资源的URI类似于http://localhost:8080/messenger/webapi/messages/1/comments。我可以使用以下URI获取消息http://localhost:8080/messenger/webapi/messages/1,但当我试图获取消息的注释时,我只得到空的花括号。 两个资源类都在同一个包中。我知道,如果

  • 编辑:我刚刚意识到,即使是一个带有应用程序条的简单屏幕,也会发生这种情况 错误:任务“:app:checkdebugaarmadata”的执行失败 无法解析配置“:app:debugRuntimeClasspath”的所有文件。无法解析com。谷歌。firebase:firebase firestore:22.1.2。所需人员:项目:应用程序 无法解析com。谷歌。firebase:firebas

  • 我在Spring Data JPA+Hibernate中使用Javers。当我使用curdrepository.save(Collection)时,Javers API会逐一审核集合中的每个对象,这会导致整个插入过程的延迟。 在集成Javers之前,处理100行需要30秒,集成Javers之后需要80秒。

  • 我使用的是JAX-RS注解,但我遇到了@BeanParam的问题。我用的是Wildfly-Swarm和maven。以下几行是我错误的一部分: