2016-03-04 94 views
0

我最近想出了一个问题,使用的代码:如何在不改变原始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),共创明天对象,并且两个对象的值相等。我不太了解这种行为。请帮忙吗?

+3

'time(&time_t)'应该是'time(today_t)'?请复制粘贴您的代码,不要手动编写伪造版本 –

+0

'today_t'是变量的一个不好名称。 '_t'后缀通常用于类型。 –

回答

3

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

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

0

引述的Linux手册页localtime功能:

返回值指向静态分配结构可能 的后续调用任何日期和时间 功能的覆盖。 localtime_r()函数的功能相同,但将数据存储在用户提供的结构中。

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

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

+0

非常感谢所有的答案,特别是对于这个答案! –

相关问题