为什么在将指针作为函数参数传递时会出现分段错误?

问题描述

我用带有指向 Node 结构的指针的 bison 构建了一个 AST:

typedef struct Node {
    enum node_type type;
    Stmt *left;
    struct Node *right;
} Node;

然后我以这种方式在野牛中打印它:

printf("%s\n",root->right->left->value_s.declaration->value_d.string);
printf("%s\n",root->right->left->value_s.declaration->id);
printf("%s\n",root->right->right->right->left->value_s.stdout->string);

显示得很好,但我试图用外部函数打印它,然后我得到了分段错误。这是入门野牛生产:

program: stmts { 
        printf("---- PRINTING AST ----\n");
        $$ =  malloc(sizeof(Node));
        $$->type = NODE_TYPE_NODE;
        $$->left = NULL;
        $$->right = $1;
        Traversal($$);
        }
;

这是外部函数代码

void Traversal(struct Node *root) {
    if(root->left == NULL && root->right == NULL)
        printf("AST is empty.");
    else {
        switch (root->left->type) {        
        case NODE_TYPE_STMT_D:
            TravDeclaration(root->left->value_s.declaration);
            break;
        /* other cases */
        default:
            printf("Error,check node_type.");
            break;
        }
        if(root->right->type != NODE_TYPE_END)
            Traversal(root->right);
    }
}

我认为在调用外部函数时,指针的使用可能存在错误。如果我在问题中遗漏了什么,请告诉我,这是我第一次来到这里。

解决方法

switch (root->left->type)

如果 root->leftNULL(在这种情况下是这样,因为您设置了 $$->left = NULL;)而 root->right 不是,上面的行将取消引用 {{1} } 指针。

类似地,如果 NULLroot->right->typeNULL 不是。