如何在不改变原始tm结构的情况下使用mktime()?
问题描述:
我最近想出了一个问题,使用的代码:如何在不改变原始tm结构的情况下使用mktime()?
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);
的问题是,我今天对象发生变化之后,我使用本地时间(& tomorrow_t),共创明天对象,并且两个对象的值相等。我不太了解这种行为。请帮忙吗?
答
localtime
对tm
结构使用单个静态变量并返回一个指向它的指针。因此,today
和tomorrow
将具有相同的地址。
有一个可重入版本localtime_r
需要第二个参数,您可以在其中指定结构数据的放置位置。
答
引述的Linux手册页localtime
功能:
返回值指向静态分配结构可能 的后续调用任何日期和时间 功能的覆盖。
localtime_r()
函数的功能相同,但将数据存储在用户提供的结构中。
因此,如果您拨打localtime()
两次,每次都会返回相同的指针值,并用新值覆盖它。 today
是一个struct tm*
指针,你拥有它; *today
是一个struct tm
对象,它由C库拥有。
在调用之后将结构(而不是指针)复制到另一个struct tm
对象,或者使用localtime_r
写入您提供的结构。 (localtime_r
不是100%便携式;它由POSIX定义,但不是由ISO C标准定义。)
+0
非常感谢所有的答案,特别是对于这个答案! –
'time(&time_t)'应该是'time(today_t)'?请复制粘贴您的代码,不要手动编写伪造版本 –
'today_t'是变量的一个不好名称。 '_t'后缀通常用于类型。 –