【问题标题】:C++ struct tm & time_tC++ 结构 tm & time_t
【发布时间】:2017-04-11 08:28:40
【问题描述】:

我这里有一个时间数组:

struct cl{
    unsigned char *buffer;
    time_t t = time(0);  
    struct tm * ct = localtime(&t);
};

然后:

cl sadi[10];

但例如我在21:58 得到sadi[5],而当我在21:59 得到sadi[6] 时。 然后我再次检查我所有的sadi[].ct->tm_min 是59。那有什么问题?是不是抓不住那一刻,会一直更新吗?如果是这样,我怎样才能捕捉到时间的瞬间而不是那样更新。

【问题讨论】:

  • 那是有效的 C++ 吗?什么时候可以初始化这样的结构的成员?
  • @AndonM.Coleman 从 C++11 开始。您可以进行类内成员初始化。
  • 就像下面的答案,那是我的错误,在这种情况下我不应该用这样的指针初始化成员,
  • 你也可以使用std::chrono:en.cppreference.com/w/cpp/chrono/time_point。有时 C++ 让你的生活更简单。如果你想用日期进行计算,我推荐 Howard Hinnants 很棒的库:github.com/HowardHinnant/date

标签: c++ c++11 time-t


【解决方案1】:

这一行:

struct tm* ct = localtime(&t);

问题在于localtime(&t) 返回的指针 是一个静态 内部缓冲区。所以每次调用它都会返回完全相同的指针值(地址)。这意味着您的所有数组元素都有指向同一个 struct tm 对象的指针。

一种解决方案是在每次调用localtime 时制作数据的副本:

struct cl {
    unsigned char* buffer;
    time_t t = time(0);  
    struct tm ct = *localtime(&t);
};

所以现在我声明struct tm ct;(不是指针)并使用返回的指针*localtime(&t) 的取消引用值对其进行初始化。

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 2014-02-02
    • 2013-06-23
    • 2015-05-06
    • 2018-06-04
    • 1970-01-01
    • 2015-04-27
    • 2021-04-18
    • 2012-12-07
    相关资源
    最近更新 更多