Вызов функции
input_lines = realloc(input_lines, (strlen(input_lines) + len)*sizeof(char));
берет текущий выделенный блок памяти и расширяет его, если может. Вы должны проверить возвращаемое значение reallo c, оно может завершиться ошибкой.
Кстати, когда вы выделяете память в C, вам всегда нужно место для окончания \ 0.
посмотрим, что произойдет с этим файлом
hello\n
world\n
Первый fgets читает привет \ n в tmp.
теперь вы делаете reallo c, хотя это и не нужно, input_lines уже указывает на буфер, который может содержать строку
char *input_lines = malloc(MAX_LINE_LEN*sizeof(char));
теперь с вашим reallo c
input_lines = realloc(input_lines, (strlen(input_lines) + len)*sizeof(char));
вы делаете strlen (input_lines) + len, поэтому вы делаете буфер strlen ("hello \" n ") + длина long.
, но важно отметить следующее:
strcat(input_lines, tmp);
у вас нет инициализированной памяти, на которую указывает input_lines to, он может содержать все, даже \ 0, так что ваш strcat потенциально может поместить строку в любом месте буфера и вызвать ошибку, которую вы описываете.
Либо выполните memset, либо используйте callo c при выделении буфера.
Если вы используете reallo c, вы должны ld отслеживает общий размер, который вы выделили, и то, сколько вы его используете, прежде чем копировать в буфер, проверьте, достаточно ли места. Если нет, добавьте определенное количество байтов в буфер.
Я также заметил, что вы читаете из файла строку за строкой, затем соединяете строки вместе, чтобы позже использовать strtok для их разделения. Было бы эффективнее вернуть массив строк.