переменная time_t и char * неожиданно перезаписывается - PullRequest
0 голосов
/ 30 марта 2019

следующий код

{
    time_t t;
    t = time(NULL);
    char *A;
    A = ctime(&t);
    printf("%s -\n", A);
    sleep(2);
    time_t t1;
    t1 = time(NULL);
    printf("%s HERE A =\n", A);
    char *B = ctime(&t1);
    printf("%s HERE B =\n", B);
    printf("%s\n", B);
}

имеет вывод

Sat Mar 30 19:10:33 2019
 -
Sat Mar 30 19:10:33 2019
 HERE A =
Sat Mar 30 19:10:35 2019
 HERE B =
Sat Mar 30 19:10:35 2019

Так как меняется переменная A? что мне нужно сделать, чтобы A оставалось с фиксированным значением

изменение char *A; на const char *A; не помогает

ожидается

Sat Mar 30 19:10:33 2019
 -
Sat Mar 30 19:10:33 2019
 HERE A =
Sat Mar 30 19:10:33 2019
 HERE B =
Sat Mar 30 19:10:35 2019

1 Ответ

1 голос
/ 30 марта 2019

Итак, 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 перезаписывает старые строки?

...