1

我正在用 C 语言实现一个 AVL 树。我在下面发布了我的树旋转,以及我在尝试测试它们时遇到的 valgrind 错误。

为什么我会收到这些错误?我知道 valgrind 错误源于我使用空指针这一事实,但我无法准确指出我做错了什么。(我已经评论了 Valgrind 错误的行)

Tree rotateRight(Tree t)
{
    Tree temp = t->L;
    t->L=temp->R;
    temp->R=t;
    temp->height=maximum(heightT(temp->L), heightT(temp->R));
    t->height=maximum(heightT(t->L), heightT(t->R));
    return t;
}

Tree rotateLeft(Tree t)
{
    Tree temp = t->R; //This is line 226
    t->R=temp->L;
    temp->L=t;
    temp->height=maximum(heightT(temp->L), heightT(temp->R));
    t->height=maximum(heightT(t->L), heightT(t->R));
    return t;
} 

Tree rotateLeftRight(Tree t)
{
    t->L=rotateLeft(t->L); //Line 235
    t=rotateRight(t);
    return t;
}

Tree rotateRightLeft(Tree t)
{
    t->R=rotateRight(t->R);
    t=rotateLeft(t);
    return t;
}

Valgrind 错误(rotateLeft 我得到了同样的结果):

==20073== Invalid read of size 8
==20073==    at 0x40196F: rotateLeft (bst.c:226)
==20073==    by 0x401A11: rotateLeftRight (bst.c:235)
==20073==    by 0x4013A9: insertT (bst.c:69)
==20073==    by 0x400E77: addin (Spell13.c:96)
==20073==    by 0x400CBE: main (Spell13.c:59)
==20073==  Address 0x10 is not stack'd, malloc'd or (recently) free'd
==20073== 
==20073== 
==20073== Process terminating with default action of signal 11 (SIGSEGV)
4

1 回答 1

0

获取您拥有的代码 + 错误报告,看起来好像Tree是这样的:

typedef struct Tree_s
{
    struct Tree_s *L;
    struct Tree_s *R;
} Tree;

这似乎也Tree->L被传递给rotateLeftRightNULL

于 2013-05-06T10:55:32.607 回答