复制结构 tm

Copying struct tm

本文关键字:tm 结构 复制      更新时间:2023-10-16

结构tm 的 glibc 版本有其他字段

long tm_gmtoff;           /* Seconds east of UTC */
const char *tm_zone;      /* Timezone abbreviation */

(参考: http://linux.die.net/man/3/ctime ) 我的问题是:如果我有一个名为结构 tm a 的数据,我想将其复制到另一个结构 tm b,如下代码所示:

time_t t = time(0);
const tm *pa = localtime(&t);
struct tm a;
if(pa) {
memcpy(&a, pa, sizeof(a));
}

但是,tm_gmtoff和tm_zone会发生什么?如何复制这些字段?

这是编译器的工作。它将采取所有必要的操作。
只需执行以下操作:

struct tm a = *localtime(&t);

由于locatime()可能会返回空指针,因此请避免

const struct tm a = *localtime(&t);  // Potential UB.

相反,请测试空性,然后使用=进行复制。memcpy()不需要。 将复制所有struct tm成员。

struct tm a = { 0 }; // Fill in a default value
const tm *pa = localtime(&t);
if (pa) {
a = *pa;
}

OP 注释 但是tm_zone是一个字符数组,但这是不对的。tm_zone不是字符数组,而是指向const字符数组的指针。 复制该指针在这里很好。

我认为在大多数情况下,memcpy是正确的做法。

但是,tm_gmtoff和tm_zone会发生什么?如何复制这些字段?

根据您链接的文档,这些字段仅在包含<time.h>之前设置_BSD_SOURCE时才存在。

所以如果你正在使用_BSD_SOURCE,你需要在memcpy之后tm_zone上使用strcpy