在三次插入后,将结构插入到链表中会挂起

时间:2015-07-24 06:28:33

标签: c linked-list

我试图在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个规则后停止向链表添加结构,然后挂起。我不知道现在发生了什么,现在已经被卡住了几个小时。

1 个答案:

答案 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指向的对象。