Ошибка в C;ошибка сегментации с методом - PullRequest
0 голосов
/ 15 мая 2019

Итак, у меня ошибка сегментации с этим фрагментом кода, и я не знаю почему. Я думал, что это связано с тем, что я использовал 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 Ответ

1 голос
/ 15 мая 2019

В функции lookup ()

 Node N = D->head;
 if(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 не увеличивается в два раза?Трудно сказать из-за неправильного форматирования кода ...

Дополнительные комментарии:

  • У вас, очевидно, есть typedef для Dictionary и Node, которые скрывают тот факт, что они являются указателями.Не делай этого.Это может сбить с толку любого, кто читает код.
  • Очень распространенное соглашение - начинать типы с заглавной буквы, но не с переменных, поэтому D, N и S - это все плохие имена.Вы можете сделать лучше, чем 1 имя персонажа в любом случае.Как насчет dict и node
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...