【问题标题】:Getting a segmentation fault trying to pass a node尝试传递节点时出现分段错误
【发布时间】:2019-06-21 23:06:19
【问题描述】:

我是 C 新手,刚开始学习如何使用指针。我正在尝试创建一个添加到 bst 的函数 (r),具体取决于参数 (int n) 是否大于根节点值。但是,在运行以下代码后,我不断收到分段错误(核心转储)。如何修复它,使其可以正常运行而不会出错。

struct node  {
    int data;
    struct node *left;
    struct node *right;
    }node;

struct node* newNode(int data){
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return (node);
    }

void r (int n, struct node* root);

int main() {

    struct node *root = newNode(1);
    printf("%d", root->data);
    r(10, root);
    return 0;
    }

void r(int n, struct node* root){
    if(n > root->left->data){
       root->right = newNode(n);
       printf("New right is: %d\n", root->right->data);
    }
    else if(n < root->left->data){
       int a = root->left->data;
       root->left->data = n;
       root->right->data = a;
       printf("New left is: %d\n", root->left->data);

    }

       return;
    }

【问题讨论】:

  • 你第一次调用r(10, root)你有if (n &gt; root-&gt;left-&gt;data)..在这种情况下root-&gt;left是NULL。

标签: c binary-search-tree


【解决方案1】:

在你写的r函数中:

root->left->data

但是root-&gt;left 等于NULL。这将导致段错误,因为您无法取消引用空指针。

您可以通过以下方式检查有效性:

// Make sure the left node exists, then do the test after
if (root->left && root->left->data > n)

因为执行root-&gt;left 将导致它检查它是否非零(意味着不是NULL)。

【讨论】:

  • 哦,哇,谢谢,我不敢相信我没有注意到这一点。非常感谢。
  • @CrisManrique 有没有办法改进我的答案?还是以任何方式不可接受?
  • 不,你是对的,我实际上忽略了一个简单的错误。你在钱上是对的。对不起,如果我听起来很讽刺。
  • @CrisManrique 有什么办法可以让这个答案变得更好吗?
  • @CrisManrique 如果这个答案对你有帮助,请mark it as the accepted answer
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2018-03-10
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多