11

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

我认识到我可以将结构的两个成员都重置为零,但是还有其他一些我忽略的方法吗?

4

5 回答 5

15

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

myTime = (struct timeval){0};

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

于 2011-06-24T01:12:56.737 回答
4

memset可能碰巧在您的平台上工作,但实际上不是推荐的(便携式)方法......

这是:

struct timeval myTime;

myTime = (struct timeval){ 0 };

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

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

使用初始化语法保证结构的字段将被正确设置为零,无论它们是整数、浮点、指针还是其他结构......即使这些东西的表示在内存中不是全零。一般来说,情况并非如此memset

于 2011-06-24T01:15:00.920 回答
1

假设您希望将struct timeval结构重新初始化为零值,无论它们是浮点类型还是整数类型,也不管浮点类型的零表示形式如何,这种方法适用于 C90 或更高版本或 C++:

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

// ...

myTime = init_timeval;

正如在R.'s answerNemo's answer中一样,这也将处理 NULL 指针,无论它们如何表示。我无法想象为什么 astruct timeval会有一个指针,但我提到这一点是因为该技术对struct timeval.

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

于 2011-06-24T02:18:31.213 回答
0

如果您正在寻找单线,我想您也可以使用 memset 来完成这项工作:

struct timeval myTime;

/* snip ... myTime is now initialized to something */

memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
于 2011-06-24T00:26:09.173 回答
-2

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

于 2011-06-24T00:24:42.157 回答