4

我有这个代码:

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

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

谢谢

4

2 回答 2

5

从有关文档gmtime

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

使用此代码创建副本:

time_t tt = time(NULL);

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

(这里的指针尊重等价于memcpy(&currentTime, gmtime(&tt), sizeof(tm))

于 2012-05-10T09:13:04.670 回答
1

他们很可能正在返回本地静态变量的地址。例如

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() 函数应返回两个静态对象之一的值:分解的时间结构和 char 类型的数组。执行任何函数都可以覆盖任何其他函数在这些对象中返回的信息。”

于 2012-05-10T09:15:01.630 回答