Вы должны отложить освобождение памяти, пока она не перестанет использоваться. Это включает в себя вызовы strtok
и возвращенные токены.
Вы можете попробовать что-то вроде этого (не проверено):
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
while (!strcmp(token, "c")) {
free(linea);
linea = readline(file);
token = strtok(linea, " ");
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
free(linea);
}
Примечание. Этот код не включает никаких проверок для возвращаемые значения так же, как это только демонстрирует, как изменить код из вопроса.
Возвращаемое значение strtok
должно проверяться на NULL
значения перед подачей в atoi
или другие функции, чтобы избежать неопределенного поведения