【问题标题】:Seg Fault in BST inorder traversalBST中序遍历中的Seg Fault
【发布时间】:2014-08-05 14:02:17
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define n 5

struct node
{
    int num;
    char *symbol;
    char *code;
    struct node *left;
    struct node *right;
}*root_ptr, *current, *previous;

void form_bst_of_dividing_positions();
void inorderTraversal(struct node *);

int dividing_positions[n], counter = 0;

int main(int argc, char *argv[])
{
    //code to populate dividing_positions

    //tree structure formation
    counter = 0;
    root_ptr = malloc(sizeof(struct node));
    root_ptr->num = dividing_positions[0];
    root_ptr->code = root_ptr->symbol = NULL;
    root_ptr->left = root_ptr->right = NULL;
    form_bst_of_dividing_positions();

    inorderTraversal(root_ptr);
    return 0;
}
void form_bst_of_dividing_positions()
{
    for(i=1;i<n;i++)
    {
        if(dividing_positions[i]==-1)
            break;
        else
        {
            struct node nodeToAdd;
            nodeToAdd.num = dividing_positions[i];
            nodeToAdd.code = nodeToAdd.symbol = NULL;
            nodeToAdd.left = nodeToAdd.right = NULL;

            current = previous = root_ptr;
            while(current!=NULL)
            {
                previous = current;
                current = (dividing_positions[i]<(current->num))? current->left : current->right;
            }
            if(nodeToAdd.num<(previous->num))
                previous->left = &nodeToAdd;
            else
                previous->right = &nodeToAdd;
        }
    }
}
void inorderTraversal(struct node *no)
{
    if(no!=NULL)
    {
        inorderTraversal(no->left);
        printf("%d ", no->num);
        inorderTraversal(no->right);
    }
}

上面的代码给了我分段错误..在代码块中,输出窗口无限打印 4。 2, 3, 1, 4 = 插入 BST。我已将我的 Java 代码转换为 C,在我的上述代码中是否有任何细节需要处理?

谢谢..

【问题讨论】:

  • 你试过使用调试器吗?
  • 如果你构建一个调试版本并在调试器中运行,调试器将在崩溃的位置停止。然后,调试器将让您检查并向上遍历函数调用堆栈,因此如果崩溃不在您的代码中,那么您可以向上遍历调用堆栈,直到找到您的代码。在那里,您可以检查变量的值以帮助您了解崩溃发生的原因。如果不出意外,请编辑您的问题以包含函数调用堆栈。

标签: c gcc


【解决方案1】:

您的 nodeToAdd 是一个局部变量,一旦您离开该代码块,它的地址就会失效。您应该使用malloc 创建新节点(并最终使用free 释放它们)。

【讨论】:

  • 哎呀是的,对..对不起,多么愚蠢..在太多Java之后失去了一点C的轨道:)
【解决方案2】:

每次添加新节点时都使用 malloc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多