重新初始化timeval结构

Reinitialize timeval struct

本文关键字:结构 timeval 初始化      更新时间:2023-10-16

如何从time.h重新初始化timeval结构?

我知道我可以将结构的两个成员都重置为零,但是否有其他方法我忽略了?

完全正确且可移植(尽管是C99)的零初始化任意(可能是聚合)类型的方法:

myTime = (struct timeval){0};

这甚至适用于包含指针和浮点成员的结构,即使实现没有使用所有零位作为空指针和浮点零的表示。

memset可能恰好在您的平台上工作,但它实际上不是推荐的(可移植的)方法。。。

这是:

struct timeval myTime;
myTime = (struct timeval){ 0 };

memset之所以有效,是因为struct timeval的所有元素碰巧都有零值,这些零值由平台上的全零位模式表示。

但规范并不要求这样做。特别是,POSIX不要求time_t类型是整数,C不要求浮点零表示为全零字节。

使用初始值设定项语法可以确保结构的字段正确地设置为零,无论它们是整数、浮点、指针还是其他结构。。。即使这些东西的表示在记忆中不是全部为零。一般情况下,memset的情况并非如此。

假设您希望struct timeval结构重新初始化为零值,而不管它们是浮点类型还是积分类型,也不管浮点类型的零表示,一个将与C90或更高版本或C++一起使用的方法:

static struct timeval init_timeval;  // or whatever you want to call it
// ...
myTime = init_timeval;

正如R的答案和Nemo的答案一样,这也将处理NULL指针,而不管它们如何表示。我无法想象为什么struct timeval会有指针,但我提到这一点是因为该技术对struct timeval以外的结构很有用。

与其他答案相比,它的缺点是需要在某个地方定义一个静态或全局变量。优点是它可以与非C99编译器配合使用。

如果你正在寻找一个单行,我想你也可以使用memset来完成任务:

struct timeval myTime;
/* snip ... myTime is now initialized to something */
memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero

您可以使用memset,然后还可以将任何特定于平台的成员清零。