首页 > 解决方案 > 为什么将指针作为函数参数传递时出现分段错误?

问题描述

我用 bison 构建了一个带有指向Node结构的指针的 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);
    }
}

我认为调用外部函数时指针的使用可能存在错误。如果我错过了问题中的某些内容,请告诉我,这是我第一次来这里。

标签: cpointerssegmentation-faultparameter-passingbison

解决方案


switch (root->left->type)

如果root->leftNULL(在这种情况下是因为您设置了$$->left = NULL;)并且root->right不是,则上述行将取消引用NULL指针。

同样,您以后使用的root->right->type将取消引用在“是”和“不是NULL”的情况下。root->rightNULLroot->left


推荐阅读