Ошибка сегментации в цикле while. Valgrind не находит ошибок - PullRequest
0 голосов
/ 06 мая 2018

Кажется, у меня ошибка сегментации, но я не могу понять, где и почему это происходит. Любой вклад будет полезен. Я в основном пытаюсь прочитать входные данные как символы, сохранить их в слове, пока я не достигну пробела, и когда я попал в пробел, сохранить это слово в wordList. Все это должно быть сделано без сохранения в памяти (необходимо использовать динамическое распределение).

Соответствующий код:

  char* word;
  int WFactor = 30;
  int WLFactor = 30;
  char** wordList;
  int wordCount = 0;
  int letterCount = 0;
  word = (char*)malloc(sizeof(char) * WFactor);
  wordList = (char**)malloc(sizeof(char*) * WLFactor);

  if( word == NULL ){
    free(word);
    free(wordList);
    fprintf(stderr, "Memory Allocation Failure");
    exit(1);
  }
  if(wordList == NULL){
    fprintf(stderr, "Memory Allocation Failure");
    exit(1);
  }

  char cur = '*';
  while(cur!=EOF){ 
    if(letterCount == WFactor){
      WFactor = WFactor * 2;
      word = realloc(word, sizeof(char)*WFactor);
      if(word == NULL){

        free(word);
        free(wordList);
        fprintf(stderr, "Memory Re-Allocation Failure");
        exit(1);
      }
    }
    cur = getchar();

    if(cur!=EOF && cur!= ' '){
      putchar(cur);
      word[letterCount] = cur;
      letterCount++;
    }

    if(cur == ' '){

    if(wordCount == WLFactor){
       WLFactor = WLFactor*2;
       wordList = realloc(wordList, sizeof(char*)*WLFactor);
       if(wordList == NULL){
         free(word);
         free(wordList);
         fprintf(stderr, "Memory Re-Allocation Failure");
         exit(1);
       }
    }

    printf("%s", "e");

    wordList[wordCount] = word;
    wordCount++;
    letterCount =0;
    word = NULL;
    WFactor = 19;
    printf("HERE");
    word = malloc(sizeof(char)*WFactor);

    if(word == NULL){
      free(wordList);
      fprintf(stderr, "Memory Allocation Failure");
      exit(1);
    }
  }
}

1 Ответ

0 голосов
/ 06 мая 2018

getchar() возвращает int не char.

Если вы присваиваете его результат char, невозможно безопасно обнаружить ^ EOF`.

Чтобы исправить это изменение

char cur = '*';

будет

int cur = '*';
...