Вы заменяете указатель now
на другой, возвращаемый ctime
. Тогда вы пытаетесь освободить это. Таким образом, вы в конечном итоге освобождаете указатель, возвращаемый ctime
, а не указатель, который вы выделили сами.
Вы не должны изменять указатель, возвращаемый ctime
.
Для ваших целей вам даже не нужно выделять память вообще. Вы можете просто использовать указатель, возвращенный ctime
напрямую.
Так что это должно работать нормально:
int writeToLog(char* str, enum LOGLEVEL logLevel) {
if(logFile && logLevel >= level) {
FILE* log;
time_t timer = time(NULL);
const char *now = ctime(&timer);
size_t length = strlen(now);
if(now[length - 1] == '\n') {
now[length - 1] = '\0';
}
log = fopen(logFile, "a+");
if (log == NULL)
return -1;
fprintf(log, "%s%s\n", now, str);
fclose(log);
}
return 0;
}
Также обратите внимание, что вы делаете два звонка на strlen(now)
. Вы должны вызвать его один раз и сохранить результат.