如何在不改变原始tm结构的情况下使用mktime()?

时间:2016-03-04 21:22:11

标签: c++ c

我最近遇到了使用代码的问题:

time_t today_t;
time(&today_t);
tm *today = localtime(&today_t);

time_t tomorrow_t = mktime(today);
tomorrow_t += 86400;
tm *tomorrow = localtime(&tomorrow_t);

问题是我的 今天 对象在我使用 localtime(& tomorrow_t)创建 后立即更改明天 对象,两个对象的值变得相等。我真的不明白这种行为。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

localtimetm结构使用单个静态变量,并返回指向它的指针。因此,todaytomorrow将具有相同的地址。

有一个可重入版本localtime_r,它接受​​第二个参数,您可以在其中指定结构数据的放置位置。

答案 1 :(得分:0)

引用localtime函数的Linux手册页:

  

返回值指向静态分配的结构,可能是   随后调用任何日期和时间都会被覆盖   功能。 localtime_r() 函数执行相同操作,但存储   用户提供的结构中的数据。

因此,如果你两次调用localtime(),它每次都会返回相同的指针值,并用新值覆盖它。 today是您拥有的struct tm*指针; *todaystruct tm对象,由C库拥有。

在调用之后将结构(而不​​是指针)复制到另一个struct tm对象,或使用localtime_r写入您提供的结构。 (localtime_r不是100%可移植的;它由POSIX定义,但不是由ISO C标准定义。)