为什么将指针作为函数参数传递时会出现分段错误?
Why am i getting segmentation fault when passing a pointer as a function parameter?
我用 bison 构建了一个 AST,并带有指向 Node 结构的指针:
typedef struct Node {
enum node_type type;
Stmt *left;
struct Node *right;
} Node;
然后我以这种方式在 bison 中打印它:
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 = ;
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->left
是 NULL
(在这种情况下是因为您设置了 $$->left = NULL;
)而 root->right
不是,上面的行将取消引用 NULL
指针。
同样,在 root->right
是 NULL
而 root->left
不是的情况下,您以后使用 root->right->type
会取消引用 NULL
。
我用 bison 构建了一个 AST,并带有指向 Node 结构的指针:
typedef struct Node {
enum node_type type;
Stmt *left;
struct Node *right;
} Node;
然后我以这种方式在 bison 中打印它:
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 = ;
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->left
是 NULL
(在这种情况下是因为您设置了 $$->left = NULL;
)而 root->right
不是,上面的行将取消引用 NULL
指针。
同样,在 root->right
是 NULL
而 root->left
不是的情况下,您以后使用 root->right->type
会取消引用 NULL
。