c-当使用malloc创建的传递参数时,mktime()的奇怪行为



下面我有四个函数
first()second()仅初始化年份,mon&结构CCD_ 3的mday
first_p()second_p使用malloc分配内存,然后分配年、月和月;mday
所有函数最后都调用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()和CCD_。

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( 只有CCD_ 10显示随机的日期和时间。

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()和CCD_。

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((,没有奇怪的行为
  • 使用malloc分配内存,然后分配值,然后将其传递给mktime((有两种行为:
    • 如果第一次调用mktime((,那么就没有奇怪的行为
    • 否则,它会显示一些随机的日期和时间。有时候岁月是消极的

我是否遗漏了mktime((中导致此行为的一些内容?

编辑:
我在first_p()second_p()的末尾添加了free(date1);free(date2);。现在一个接一个调用*_p()函数并没有显示随机的日期和时间。然而,在它们之前调用first()second()函数会显示第一个*_p()函数的随机日期和时间,而在它之后的函数则不会,即,对于上面列出的情况1(、3(和4(。

然而,我无法释放它,因为我在其他地方需要它们(为什么我必须首先使用malloc(。有办法实现吗?

malloc()数据中的小时、分钟、秒和夏令时标志中有准随机(不确定(值,因此从mktime()返回不确定的结果。

使用calloc()而不是malloc(),或者自己将字段清零。

此外,请考虑将tm_isdst成员设置为-1,以让系统确定夏令时还是标准时间适用于日期。

最新更新