gmtime同时改变两个指针

时间:2012-05-10 09:08:11

标签: c++ datetime

我有这段代码:

time_t tt = time(NULL);
tm* currentTime = gmtime(&tt);
tm* storedTime = gmtime(&m_time);

其中m_time是施工时设置的time_t成员数据。 当我使用此数据成员设置storedTime时,当前时间获取相同的值,就像两个tm指针指向同一个变量一样。这是预期的行为吗?我怎么能分开tm结构来比较时间?

由于

2 个答案:

答案 0 :(得分:5)

有关gmtime的文档:

  

此结构静态分配并由函数gmtime和localtime共享。 每次调用其中一个函数时,都会覆盖此结构的内容

使用此代码创建副本:

time_t tt = time(NULL);

tm currentTime = *gmtime(&tt);
tm storedTime = *gmtime(&m_time);

(这里的指针参考等同于memcpy(&currentTime, gmtime(&tt), sizeof(tm))

答案 1 :(得分:1)

他们可能正在返回本地静态变量的地址。 E.g。

struct tm *gmtime(struct time_t *tt)
{
    static struct tm local_tm;
    /* do work */
    return &local_tm;
}

查看互联网上的手册页(我谷歌“man gmtime”),这是一个常见的主题,这不是一个可重入的功能,甚至可能与其他功能共享一个返回值:

  

POSIX.1-2001说:“asctime(),ctime(),gmtime()和localtime()   函数应返回两个静态对象之一的值:a   细分时间结构和char类型数组。执行任何   这些函数可能会覆盖其中任何一个返回的信息   任何其他功能都可以使用这些对象。“