首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在复制结构tm

正在复制结构tm
EN

Stack Overflow用户
提问于 2017-04-28 17:46:14
回答 3查看 2.6K关注 0票数 1

结构tm的glibc版本具有额外的字段。

代码语言:javascript
复制
long tm_gmtoff;           /* Seconds east of UTC */
const char *tm_zone;      /* Timezone abbreviation */

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

代码语言:javascript
复制
time_t t = time(0);
const tm *pa = localtime(&t);
struct tm a;
if(pa) {
    memcpy(&a, pa, sizeof(a));
}

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

EN

回答 3

Stack Overflow用户

发布于 2017-04-28 17:52:21

这是你的编译器的工作。它将采取一切必要的行动。

只需这样做:

代码语言:javascript
复制
struct tm a = *localtime(&t);
票数 4
EN

Stack Overflow用户

发布于 2021-12-19 23:18:24

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

代码语言:javascript
复制
const struct tm a = *localtime(&t);  // Potential UB.

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

代码语言:javascript
复制
struct tm a = { 0 }; // Fill in a default value
const tm *pa = localtime(&t);
if (pa) {
  a = *pa;
}

OP评论But tm_zone being a character array,然而这是错误的。tm_zone不是字符数组,而是指向const字符数组的指针。在这里复制指针就可以了。

票数 1
EN

Stack Overflow用户

发布于 2021-12-19 23:10:51

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

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

根据the doc you linked的说法,只有在包含<time.h>之前设置了_BSD_SOURCE时,这些字段才会出现。

因此,如果您使用的是_BSD_SOURCE,则需要在tm_zone上使用memcpy之后的strcpy

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43677130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档