C 切换二叉树子树SIGSEV
我试图切换二叉树子树,但是我得到了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 =
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;
}
无需对温度进行malloctemp
。实际上,将内存分配给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;
}