如何从 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.'s answer和Nemo's answer中一样,这也将处理 NULL 指针,无论它们如何表示。我无法想象为什么 astruct timeval
会有一个指针,但我提到这一点是因为该技术对struct timeval
.
与其他答案相比,它的缺点是它需要在某处定义静态或全局变量。优点是它可以与非 C99 编译器一起使用。
如果您正在寻找单线,我想您也可以使用 memset 来完成这项工作:
struct timeval myTime;
/* snip ... myTime is now initialized to something */
memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
您可以使用memset
,然后您还可以将任何特定于平台的成员归零。