使用 malloc 创建的传递参数时 mktime() 的奇怪行为
Strange behavior of mktime() when using passing parameter created by malloc
下面我有四个函数
first()
和 second()
仅初始化结构 tm
.
的年份、星期一和星期三
first_p()
和 second_p
使用 malloc 分配内存,然后分配年、月和日。
所有函数最后调用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() 没有奇怪的行为。
- 使用 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
,让系统确定夏令时或标准时间是否适合日期。
下面我有四个函数
first()
和 second()
仅初始化结构 tm
.
的年份、星期一和星期三
first_p()
和 second_p
使用 malloc 分配内存,然后分配年、月和日。
所有函数最后调用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() 没有奇怪的行为。
- 使用 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
,让系统确定夏令时或标准时间是否适合日期。