c - 为什么将指针作为函数参数传递时出现分段错误?
问题描述
我用 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);
}
}
我认为调用外部函数时指针的使用可能存在错误。如果我错过了问题中的某些内容,请告诉我,这是我第一次来这里。
解决方案
switch (root->left->type)
如果root->left
是NULL
(在这种情况下是因为您设置了$$->left = NULL;
)并且root->right
不是,则上述行将取消引用NULL
指针。
同样,您以后使用的root->right->type
将取消引用在“是”和“不是NULL
”的情况下。root->right
NULL
root->left
推荐阅读
- php - 如何链接到页面的特定部分 HTML PHP
- c# - 当后端代码中的简单键值变量工作相同时,为什么要使用 redis 作为缓存层?
- google-apps-script - Google Slides Apps 脚本检索页面中的形状
- python-3.x - 在 KNeighborsClassifier 中使用自定义指标时,我不断收到“TypeError:只有整数标量数组可以转换为标量索引”
- java - JavaFX - 在使用选项卡时将 GUI 拆分为单独的类
- jquery - 通过函数调整电子窗口大小
- scheme - 匹配方案中的括号
- android - 当我使用 adb 显示 /sys/kernel/debug/tracing/available_filter_functions 时没有这样的设备
- python - 初始化以迭代抽象pyomo模型中的集合?
- angular-cli - 运行 ng serve -o 时出现错误