结构tm的glibc版本具有额外的字段。
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,如以下代码所示:
time_t t = time(0);
const tm *pa = localtime(&t);
struct tm a;
if(pa) {
memcpy(&a, pa, sizeof(a));
}但是,tm_gmtoff和tm_zone会发生什么呢?如何复制这些字段呢?
发布于 2017-04-28 17:52:21
这是你的编译器的工作。它将采取一切必要的行动。
只需这样做:
struct tm a = *localtime(&t);发布于 2021-12-19 23:18:24
由于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评论But tm_zone being a character array,然而这是错误的。tm_zone不是字符数组,而是指向const字符数组的指针。在这里复制指针就可以了。
发布于 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。
https://stackoverflow.com/questions/43677130
复制相似问题