为什么strptime c-function会改变结构?

时间:2016-12-05 21:04:09

标签: c linux gcc strptime time.h

函数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

1 个答案:

答案 0 :(得分:1)

tmStarttmStop未初始化,因此某些字段在传递给mktime时将未初始化。因此,这种行为在技术上是未定义的。

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

  

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