Почему моя C программа обрабатывает sh, когда я добавляю какой-либо оператор в основную функцию? - PullRequest
3 голосов
/ 21 марта 2020

Я довольно новичок в C - я создал программу, которая читает текстовый файл и с помощью нескольких функций обрабатывает текст с помощью malloc() и realloc() и форматирует вывод. На данный момент в моем main() есть только следующее:

1. инициализация структур

  line_arr.max_size = 0;
  line_arr.num_lines = 0;
  line_arr.line = NULL;

  Word_Array word_arr;
  word_arr.max_size_ = 0;
  word_arr.num_words = 0;
  word_arr.word = NULL;

  Word_Array ex_words;
  ex_words.max_size_ = 0;
  ex_words.num_words = 0;
  ex_words.word = NULL; 

Line_Array.line и Word_Array.word являются указателями на структуры Line и Word соответственно. Line и Word являются структурами, которые содержат массив символов и int, который отслеживает номер строки, в которой находится строка или слово.

2. вызов функций, обрабатывающих входные текстовые файлы

  get_lines(&line_arr, argv[1]);
  get_words(&line_arr, &word_arr);
  sort_keywords(&word_arr);

Все мои функции возвращают void.

Все выходные данные и форматирование выполняются в функциях и в любом месте, которое у меня есть malloc, d впоследствии я освободил безо всякой ошибки. Программа выдает желаемый результат, , однако, если я добавлю какое-либо утверждение к main(), даже оператор печати, я получу ошибку bus10 или segmentation fault 11.

Я пробовал GDB, но я не использовал его раньше, и кажется, что GDB зависает и зависает, когда я все равно пытаюсь запустить программу.

Интересно, кто-нибудь знает, почему это так? / есть какой-то фундаментальный лог c Я не понимаю C или malloc()?

Спасибо за ваш опыт!

изменить структуры:

typedef struct Line Line;
struct Line{
  char line[MAX_LINE_LEN];
};

typedef struct Word{
  char word[MAX_WORD_LEN];
  int line_number;
}Word;

typedef struct Word_Array{
  //will point to the base in memory where the list of words begins.
  Word *word;
  int max_size_;
  int num_words;
}Word_Array;

typedef struct Line_Array{
  //line is a variable that stores an address of a line object.
    Line *line;
    int max_size;
    int num_lines;
}Line_Array;

get_lines():

void get_lines(Line_Array *la, char const *filename){
  Line *line_ptr;
  char *buffer;
  size_t buffer_len;

  FILE *fp = fopen(filename, "r");
  if(fp == NULL){
    printf("Can't read file. \n");
    exit(1);
  }

  while (getline(&buffer, &buffer_len, fp) > 0) {
    buffer[strlen(buffer)-1] = '\0';
    if (la->line == NULL) {
      la->line = (Line *) malloc(sizeof(Line));
      if (la->line == NULL) {
        exit(1);
      }
      la->max_size = 1;
      la->num_lines = 0;
    }

    else if (la->num_lines >= la->max_size) {
      line_ptr = (Line *) realloc(la->line, (2*la->max_size) * sizeof(Line));
      if (line_ptr == NULL) {
        exit(1);
      }

      la->max_size *= 2;
      la->line = line_ptr;

    }

    strncpy(la->line[la->num_lines].line, buffer, MAX_LINE_LEN);
    la->num_lines++;
  }
  fclose(fp);
}

У меня есть не освобождает память в этом методе, так как я использую ее позже, но даже когда другие функции не выполняются, существует та же проблема, где, если я добавляю что-то к основному до или после вызова get_lines, я получаю ошибку шины 10 как мой единственный выход. Однако, если я вызову только get_lines() и другие функции, программа выдаст правильный вывод.

1 Ответ

3 голосов
/ 21 марта 2020

Как минимум одна проблема:

Переменные необходимо инициализировать перед использованием getline(). @ Флюгер

  //char *buffer;
  //size_t buffer_len;
  char *buffer = NULL;
  size_t buffer_len = 0;

Примечания:

После while (getline(... код должен освободиться с free(buffer);

strncpy(la->line[la->num_lines].line, buffer, MAX_LINE_LEN); не гарантирует la->line[la->num_lines].line является строкой . Почему strncpy небезопасен?

...