我试图在C中实现一个基本的无上下文语法解析器。我仍然是C的新手,并试图解决问题。
我想解析以下格式的文件:
RULE LEFT_HAND_SIDE RIGHT_HAND_SIDE
RULE2 LEFT_HAND_SIDE RIGHT_HAND_SIDE
etc
这是我的代码:
while(fscanf(fp, "%s %s %s\n", type, LHS, RHS) == 3){
if(!strcmp(type, "RULE") || !strcmp(type, "rule")){
if(rules->head == NULL && rules->tail == NULL){
rules->head = malloc(sizeof(Rule));
rules->head = &(Rule) {
.LHS = LHS,
.RHS = RHS,
.condition = "",
.next = NULL
};
rules->tail = rules->head;
}
else{
Rule *curr;
curr = rules->head;
while(curr->next){
curr = curr->next;
}
curr->next = malloc(sizeof(Rule));
curr->next = &(Rule) {
.LHS = LHS,
.RHS = RHS,
.condition = "",
.next = NULL
};
rules->tail = curr->next;
}
}
}
当我运行这个程序并输入一个包含7个规则的文件时,它会在成功插入3个规则后停止向链表添加结构,然后挂起。我不知道现在发生了什么,现在已经被卡住了几个小时。
答案 0 :(得分:1)
将数据分配给节点指针时:
curr->next = malloc(sizeof(Rule));
curr->next = &(Rule) {
.LHS = LHS,
.RHS = RHS,
.condition = "",
.next = NULL
};
首先分配内存,然后将指针指向具有自动存储的本地对象的地址,即使用复合文字创建的地址。这意味着你立即泄漏分配的内存,因为你丢失了它的唯一句柄,并且一旦本地对象超出范围,你的指针可能会指向无效的内存。 (当你稍后尝试free
内存时,你会收到一个错误。)
如果要初始化新分配的复合文字,请执行以下操作:
curr->next = malloc(sizeof(Rule));
*curr->next = (Rule) {
.LHS = LHS,
.RHS = RHS,
.condition = "",
.next = NULL
};
这将创建一个本地对象,并将其内容复制到curr->next
指向的对象。