Итак, ctime
возвращает указатель на строку. Вы назначаете этот указатель на A и B. В этом случае он возвращает один и тот же указатель, а это означает, что A и B указывают на один и тот же адрес в памяти. Вы можете увидеть это, если добавите код для печати адреса:
printf("A=0x%x, B=0x%x", A, B);
Страница справочника для time
объясняет, что это поведение, за которым нужно следить:
Возвращаемое значение указывает на статически размещенную строку, которая может быть перезаписана последующими вызовами любой из функций даты и времени. Функция также устанавливает внешние переменные tzname, timezone и daylight (см. Tzset (3)) с информацией о текущем часовом поясе. Повторяющаяся версия ctime_r () делает то же самое, но сохраняет строку в предоставленном пользователем буфере, который должен иметь пространство как минимум для 26 байтов. Не нужно устанавливать tzname, часовой пояс и дневной свет.
Итак, чтобы исправить это, вы можете использовать возвращающуюся версию ctime
вместо ctime_r
:
char C[27];
ctime_r(&t1, &C);
Вы также можете использовать strcpy
или strdup
, чтобы скопировать его в собственную строку, которая не будет перезаписана.
Вот еще один ответ на этот вопрос: Сохранение новых точек во времени с помощью ctime перезаписывает старые строки?