У меня возникли проблемы с определением причины возникновения сегментации в моей программе. Я сделал такие вещи до этого успешно, но эта специфическая функция вызывает ошибку сегментации.Ошибка сегментации - sprintf
Мой код здесь:
void logErrorStatus(char* message)
{
char* errorMessage = "test";
sprintf(errorMessage, "ERROR (%s, %d) >> %s", __FILE__, __LINE__, message);
logMessage(errorMessage);
}
void logMessage(char* message)
{
FILE* file = NULL;
char buffer[SIZE];
struct tm *sTm;
time_t now = time(NULL);
sTm = localtime(&now);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", sTm);
file = fopen(LOGFILE, "a");
if(file == NULL)
{
printf("Error opening log file.\n");
}
else
{
fprintf(file, "%s : %s\n", buffer, message);
}
if(fclose(file) != 0)
{
printf("Error closing log file.\n");
}
}
вина сегментный происходит на линии Sprintf() в функции logErrorStatus().
Любая помощь будет замечательной! Благодаря!
Проверить если 'malloc' возвращает' NULL' или использует 'snprintf'. –
Более глубокие соображения: Согласитесь «пытаться перезаписать постоянный строковый литерал», но не в пользу выделения памяти. Это не 'malloc()' is evil, а сообщение _error_ должно регистрироваться, код должен избегать ресурсов, которые являются типичными источниками ошибок. Например, ошибка «Out-of-memory», и этот ответ вызывает вызов 'malloc()' возвращает 'NULL'. Лучше называть 'logMessage (message);' в этом случае, чем ничего не делать. IMO, favor' "ERROR (% .64s,% d) >>% .80s", 'в достаточно широкий подход фиксированного буфера, поскольку я не доверяю чрезмерно длинным сообщениям об ошибках. OTOH, этот ответ отвечает интересам OP – chux
@chux - Я согласен. Но в будущем вопрос может быть полезен и тем, кто не пишет регистратор ошибок, поэтому оба варианта были представлены. – owacoder