我试图创建一个函数,返回二叉树的镜像副本.

Visual example from the page I'm taking this exercise from.

左边的那个被复制成与右边的那个相似.这是函数的代码,包含二进制 node 的定义和我使用的"插入 node "函数:

typedef struct bNode {
    int data;
    struct bNode *left;
    struct bNode *right;
} bNode;
    
//  =============================================================
    
bNode* reverse_tree (bNode **tree) {
    bNode *copy = malloc(sizeof(bNode));
    copy->data = (*tree)->data;
    if (!((*tree)->right) && !((*tree)->left)){
        return copy;
    }
        
    copy->left = reverse_tree(&(*tree)->right);
    copy->right = reverse_tree(&(*tree)->left);
    return copy;
}
    
//  =============================================================
    
void insert(bNode **tree, int data) {
    bNode *temp, *previous, *current;

    if (*tree == NULL) {
        temp = (bNode *) malloc(sizeof (bNode));
        temp->data = data;
        temp->left = NULL;
        temp->right = NULL;
        *tree = temp;
        return;
    }

    if (data < (*tree)->data) {
        insert(&(*tree)->left, data);
    } else if (data > (*tree)->data) {
        insert(&(*tree)->right, data);
    }
}

经过一些故障排除,一层递归可以正常工作,但在那之后,指针会中断(即,它们指向内存中不可访问的部分),程序会收到SIGSEGV分段错误.

为什么我会收到这个SIGSEGV,我如何避免它?

P、 我对指针缺乏经验;我希望不是太糟.

(左侧的复制与右侧的复制相似)

推荐答案

至少函数reverse_tree有一个bug.

此if语句的子语句

if (!((*tree)->right) && !((*tree)->left)){
    return copy;
}

获取当右指针和左指针都是空指针时的控件.

所以这个代码片段

copy->left = reverse_tree(&(*tree)->right);
copy->right = reverse_tree(&(*tree)->left);

当只有一个指针为空指针时,无法获取控件.

在本例中,在函数的下一次递归调用中,此语句

copy->data = (*tree)->data;

调用传递的空指针的未定义行为.

C++相关问答推荐

如何在Switch和case中发出有关enum类型不匹配的编译器警告?

当我try 计算一个多项时,看到segfault.我做错了什么?

有什么方法可以检测SunOS上的SparcWorks吗?

如何判断宏参数是否为C语言中的整型文字

为什么双重打印与C中的float具有不同的大小时具有相同的值?

如何在C中从函数返回指向数组的指针?

Can函数指针指向C++中具有不同参数连续性的函数

仅在给定的大小和对齐方式下正确创建全局

以下声明和定义之间的区别

用C语言计算文本文件中的整数个数

如何用c语言修改shadow文件hash部分(编程)?

编译器如何处理具有更复杂值的枚举?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

覆盖读取函数,但当文件描述符为3或4时,我有问题

从不兼容的指针类型返回&&警告,但我看不出原因

程序对大输入给出错误答案

';malloc():损坏的顶部大小';分配超过20万整数后

execve 不给出which命令的输出

Struct 内的数组赋值

如何用用户输入的多个字符串填充数组?