C 切换二叉树子树SIGSEV

C 切换二叉树子树SIGSEV,c,pointers,segmentation-fault,binary-tree,C,Pointers,Segmentation Fault,Binary Tree,我试图切换二叉树子树,但是我得到了SIGSEV,我不知道如何修复它 我的树结构: typedef struct Tree_node_ Tree_node; typedef Tree_node* Tree; struct Tree_node_ { int value; Tree left; Tree right; }; 切换子树代码: void switch(Tree t) { Tree temp = malloc(sizeof(t)); temp =

我试图切换二叉树子树,但是我得到了SIGSEV,我不知道如何修复它

我的树结构:

typedef struct Tree_node_ Tree_node;
typedef Tree_node* Tree;

struct Tree_node_
{
    int value;
    Tree left;
    Tree right;
};
切换子树代码:

void switch(Tree t) {
    Tree temp = malloc(sizeof(t));
    temp = t;
    t = t->left;
    temp->left = t->right;
    t->right = temp;
}
当我试图读取
t->right

temp->left=t->right

分段错误的原因:这里您将
t->left->right
分配给
temp->left
,因为
t->right=t->left->right
t=t->left

解决方案
temp=t->左侧
t->left=t->right
t->right=temp

    t->right = temp;
}
无需对温度进行malloc
temp
。实际上,将内存分配给
temp
会导致内存泄漏,因为您正在将
temp
中存储的地址修改为
t
temp=t
)。
我的意思是,在执行
temp=t
之后,您将丢失指向
malloc
'ed地址的指针。这将导致内存泄漏。
Valgrind将给您绝对丢失的错误。

让我们看看:

void switch(Tree t) {
    Tree temp = malloc(sizeof(t));
temp
指针分配一个缓冲区,该缓冲区指向使用
malloc
分配的未初始化内存

    temp = t;
t
的指针值指定给
temp
。此时会泄漏分配给
malloc()
的内存,从此时起,该内存没有指向它的引用点int

    t = t->left;
您将
t
的值更改为指向它的左子级,但是没有上下文来知道
t
的左子级是否存在(可能是
NULL

现在,原始
t
节点的两个子节点指向同一
右侧
子节点(而原始节点仍由
temp
指向)

现在
t->right
指向其父节点

首先,不需要使用
malloc()
,因为您应该切换节点
t
的子节点,所以您没有将新节点插入到树中。第二,要交换两个变量(指针、数字或其他)的值,有一个简单的代码允许您这样做,即:

    Type temp = a;
    a = b;
    b = temp;
因此,要切换子项(与任何指针为null无关),必须执行以下操作:

void switch(Tree t) {
    Tree temp = t->left;
    t->left = t->right;
    t->right = temp;
}
没有malloc,没有更多的临时变量,等等。即使子指针是
NULL
此代码也可以工作。如果还要检查
t
是否不为空,则:

#include <stdlib.h>  /* for EXIT_FAILURE */

void switch(Tree t) {
    if (t == NULL) {
        printf("Illegal parameter NULL passed to switch()");
        exit(EXIT_FAILURE);
    }
    Tree temp = t->left;
    t->left = t->right;
    t->right = temp;
}
#包括/*用于退出失败*/
无效开关(树t){
如果(t==NULL){
printf(“传递给开关()的非法参数NULL”);
退出(退出失败);
}
树温度=t->左;
t->左=t->右;
t->右=温度;
}

temp=t
此赋值覆盖了
malloc
@kiranBiradar我尝试分配新的temp,方法是给它t的左、右值,但仍然没有成功。
temp
应该只是一个指针:
temp=t->left;t->左=t->右;t->右=温度当然,它已经只是一个指针,但您已经将自己与
typedef
混淆了。故事的寓意:不要键入定义指针。我也想切换值,这个算法不会抛出错误,但这不是我需要的。这几乎是正确的答案,但最后一行当然应该是,
t->right=temp
@printf感谢您指出错误。已修复。@jikix请尝试修改后的代码。
#include <stdlib.h>  /* for EXIT_FAILURE */

void switch(Tree t) {
    if (t == NULL) {
        printf("Illegal parameter NULL passed to switch()");
        exit(EXIT_FAILURE);
    }
    Tree temp = t->left;
    t->left = t->right;
    t->right = temp;
}