C中的错误;方法的分割错误

时间:2019-05-15 01:36:45

标签: c

所以我在这段代码中出现细分错误,我不知道为什么。我认为这与我使用NULL错误(?)的事实有关,但我认为并非如此。 。我尝试添加更多错误消息,以查看是否可以执行此操作,但是仍然出现相同的错误/:

char* lookup(Dictionary D, char* k){
   Node N = D->head;

   if(D == NULL){
    fprintf(stderr, "Error: calling lookup() on null Dictionary");
    exit(EXIT_FAILURE);
   }

   while(N!=NULL){
    if(strcmp(N->key,k)==0){
      return N->value;
      break;
    }
    N = N->next;
   }
   return NULL;
}


void insert(Dictionary D, char* k, char* v){
  // Node N = D->head;

   if(D==NULL){
    fprintf(stderr, "Error: inserting on a null Dictionary\n");
    exit(EXIT_FAILURE);
   }

   if(lookup(D,k)!=NULL){
    fprintf(stderr, "already existing\n");
    exit(EXIT_FAILURE);
   }

   else{

     if(D->numItems==0){
      Node N;
      N = newNode(k,v);
      D->head = N;
      D->numItems++;
     }

    //if there is only a head node, add node after it
   else{
    Node S = D->head;
      while(S!=NULL) {
        S = S->next;
      }
      S->next = newNode(k,v);
    }
      D->numItems++;
   }

 }

1 个答案:

答案 0 :(得分:1)

在lookup()函数中

 Node N = D->head;
 if(D == NULL){

在检查D是否为NULL之前,您已经访问过D。这可能会导致NULL指针访问和核心转储。

在insert()函数中:

 while(S!=NULL) {
    S = S->next;
  }
  // You are guaranteed that S is now == NULL, so the
  // next line is a NULL pointer access.
  S->next = newNode(k,v);

您需要保留最后一项,以便可以说出last->next = newNode(k, v);

也:如果集合中有0个项目,numItems是否不会增加两次?由于错误的代码格式,很难说...

其他评论:

  • 您显然具有Dictionary和Node的typedef,它们隐藏了它们是指针的事实。不要那样做这会使任何阅读代码的人感到困惑。
  • 一个非常常见的约定是使用大写字母而不是变量开头的类型,因此DNS都是坏名字。无论如何,您都可以完成1个以上的字符名称。 dictnode