为了使此代码正常运行,必须使用 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规范中的这个小片段(我的重点):

适当的结构成员的值tm被设置为对应于语言环境信息的值。

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

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

很有可能,如果您只想查看已解析的字段,则不必担心先归零。但也有可能编写您的strptime实现的人“太聪明了”,并决定他们可以对数据进行后期处理以解决问题。例如,如果您有26:00:00时间,并且您将日期解析为March 1,它可能会将其调整为March 2, 02:00:00

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


“不够”是什么意思?struct tm有 9 个不同的字段,它们是提供的日期/时间信息的一部分strptime。根据您提供的格式,该函数将填写它可以从您的字符串中解析的字段。如果您需要将未引用的其他字段设置为 0,则strptime希望您自己执行此操作。它不会预先假设您要将它们初始化为什么。您可以选择将它们设置为其他内容,无论是来自先前的计算还是事件。

使用 struct tm temp 时,tm 不会接管内存 sizeof(struct tm) 字节吗?为什么我们需要内存集?

memset 不分配内存。它将它初始化为 0。声明该结构不会为您将其初始化为 0。

但我不想使用所有字段,只使用 strptime 中格式中提到的字段。

@dklovedoctor 那么您可能不需要使用 memset 将其余部分设置为 0。但是这样做有什么坏处呢?