如何从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
,然后还可以将任何特定于平台的成员清零。