Я довольно новичок в 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()
и другие функции, программа выдаст правильный вывод.