Странное поведение mktime () при использовании параметра передачи, созданного malloc - PullRequest
0 голосов
/ 23 апреля 2020

Ниже у меня есть четыре функции.
first() и second() инициализируют только год, понедельник и день структуры tm.
first_p() и second_p выделяют память, используя mallo c , затем назначьте год, понедельник и день.
Все функции в конце вызывают mktime().

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void first()
{
    int year1 = 2020, month1 = 4, day1 = 23;
    struct tm date1 = {.tm_year = year1-1900, .tm_mon = month1-1, .tm_mday = day1};
    mktime(&date1);
    printf("%s", asctime(&date1));
}

void second()
{
    int year2 = 2021, month2 = 5, day2 = 24;
    struct tm date2 = {.tm_year = year2-1900, .tm_mon = month2-1, .tm_mday = day2};
    mktime(&date2);
    printf("%s", asctime(&date2));
}

void first_p()
{
    int year1 = 2020, month1 = 4, day1 = 23;
    struct tm *date1 = (struct tm *) malloc (sizeof(struct tm));
    date1->tm_year = year1 - 1900;
    date1->tm_mon = month1 -1;
    date1->tm_mday = day1;
    mktime(date1);
    printf("%s", asctime(date1));
}

void second_p()
{
    int year2 = 2021, month2 = 5, day2 = 24;
    struct tm *date2 = (struct tm *) malloc (sizeof(struct tm));
    date2->tm_year = year2 - 1900;
    date2->tm_mon = month2 - 1;
    date2->tm_mday = day2;
    mktime(date2);
    printf("%s", asctime(date2));
}

Я пробовал разные перестановки при вызове этих функций в main():

1) first_p() и second_p() показывают случайные дату и время.

int main()
{
    first();
    second();
    first_p();
    second_p();

    return 0;
}
Thu Apr 23 00:00:00 2020
Mon May 24 00:00:00 2021
Thu Sep 30 23:09:20 66488
Wed Aug 31 14:44:48 66489

2) только second_p() показывает случайную дату и время.

int main()
{
    first_p();
    second_p();
    first();
    second();

    return 0;
}
Thu Apr 23 00:00:00 2020
Sun Dec  8 01:26:16 -103880
Thu Apr 23 00:00:00 2020
Mon May 24 00:00:00 2021

3) только second_p() показывает случайную дату и время.

int main()
{
    first_p();
    first();
    second();
    second_p();

    return 0;
}
Thu Apr 23 00:00:00 2020
Thu Apr 23 00:00:00 2020
Mon May 24 00:00:00 2021
Thu Oct  9 04:53:52 60110

4) first_p() и second_p() показывают случайные дату и время.

int main()
{
    first();
    first_p();
    second_p();
    second();

    return 0;
}
Thu Apr 23 00:00:00 2020
Sat Sep 25 12:05:36 182934
Fri Aug 26 03:41:04 182935
Mon May 24 00:00:00 2021

Я наблюдаю:

  • Непосредственная инициализация структуры и последующая ее передача в mktime () в любом месте не имеет странного поведения.
  • Выделение памяти с помощью mallo c, затем присвоение значений и последующая передача в mktime () имеет два поведения:
    • Если mktime () вызывается впервые, странного поведения нет.
    • , в противном случае он показывает случайную дату и время. Иногда годы отрицательны!

Я что-то упускаю из-за mktime (), который отвечает за это поведение?

Редактировать:
Я добавил free(date1); и free(date2); в конце first_p() и second_p(). Теперь при вызове *_p() функций одна за другой не отображаются случайные дата и время. Однако при вызове функции first() или second() перед ними отображаются случайные дата и время для первой функции *_p(), в то время как функции идут после нее, то есть для случаев 1), 3) и 4), перечисленных выше.

Однако, не могу освободить его, потому что они мне нужны где-то еще (почему я должен был использовать mallo c в первую очередь). Есть ли способ достичь этого?

1 Ответ

1 голос
/ 23 апреля 2020

У вас есть квазислучайные (неопределенные) значения в часах, минутах, секундах и флаге перехода на летнее время в данных malloc(), поэтому вы получаете неопределенные результаты от mktime().

Использование calloc() вместо malloc() или обнуление полей самостоятельно.

Кроме того, рассмотрите возможность установки элемента tm_isdst на -1, чтобы система могла определить, подходит ли летнее время или стандартное время для дат .

...