为什么在strptime之前需要memset

Why memset is needed before strptime

为了使此代码正确 运行,必须使用 memset。这是为什么?

struct tm temp;
memset(&temp, 0, sizeof(struct tm));
strptime(str.c_str(), "%d-%m-%Y", &temp);

为什么这还不够?

struct tm temp;
strptime(str.c_str(), "%d-%m-%Y", &temp);

非常感谢。

因为 strptime specification 中的这个小片段(我的重点):

values for the appropriate tm structure members are set to values corresponding to the locale information.

换句话说,它不一定设置所有 tm 结构的字段,因此您首先将所有内容初始化为零。否则,作为局部变量,在解析时间字符串之前(以及之后,除非您明确解析适当的项目),它的所有字段中都可能包含任意信息。

这样做的一个原因(跳过您未明确解析的字段)是因为您可能已经设置了 tm 并且您只想更改某些字段(例如,使用 time()localtime() 以获得今天的 tm,然后解析下午 5 点以获得今天的特定时间)。

很有可能,如果您只查看已解析的字段,则不必担心先归零。但也可能 可能性 编写你的 strptime 实现的人是 "too clever",并决定他们可以 post-massage 数据来解决问题.例如,如果您将 26:00:00 作为时间,并且将日期解析为 March 1,它可能会将其调整为 March 2, 02:00:00

我并不是说这很可能(或者甚至是规范允许的)但是,考虑到事先将结构归零的成本最低,我可能更愿意安全一些。特别是因为有很多人 "too clever" :-)