为什么strptime c函数改变结构?

函数strptime()不可理解的行为:

 #define _XOPEN_SOURCE #include <stdio.h> #include <time.h> double getPeriod(char * dateStart, char * dateStop) { struct tm tmStart, tmStop; time_t timeStampStart, timeStampStop; strptime(dateStart, "%Y-%m-%d %H:%M:%S", &tmStart); strptime(dateStop, "%Y-%m-%d %H:%M:%S", &tmStop); timeStampStart = mktime(&tmStart); timeStampStop = mktime(&tmStop); printf("%d\t%d\n", tmStart.tm_hour, tmStop.tm_hour); } int main() { getPeriod("2016-12-05 18:14:35", "2016-12-05 18:18:34"); return 0; } 

输出:

 17 18 

为什么会发生?

编译器gcc(GCC)6.2.1 OS Linux

tmStarttmStop没有初始化,所以有些字段在传递给mktime时候会被初始化。 因此,行为在技术上是不确定的。

strptime手册页(注意前两句):

原则上,这个函数不会初始化tm,但只存储指定的值。 这意味着应该在调用之前初始化tm 。 不同UNIX系统之间的细节有所不同。 glibc实现不会触及那些没有明确指定的字段,除非它重新计算tm_wdaytm_yday字段,如果任何年份,月份或日期元素更改。