指向struct tm变量的指针,无法返回更改

时间:2016-05-06 13:04:17

标签: c pointers time struct strptime

我有一个简单函数的问题(我猜是因为一些错误的指针赋值)。由于strptime函数(一个带有字符串并且返回带有所有数据集的struct tm的函数)在Windows中不存在,我通过调用其他基本工作函数创建了一种strptime函数。 / p>

这是测试代码。在STRPTIME功能中,时间设置得很好,而在主要时我丢失了信息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void STRPTIME(char *strtm, struct tm *tminfo)
{
    time_t rawtime;
    int day, month, year;

    sscanf(strtm, "%d-%d-%d\n", &year, &month, &day);
    time( &rawtime );
    tminfo = localtime( &rawtime );
    tminfo->tm_year = year - 1900;
    tminfo->tm_mon  = month - 1;
    tminfo->tm_mday = day;

    mktime(tminfo);
    printf("date %d-%d-%d\n", tminfo->tm_year, tminfo->tm_mon, tminfo->tm_mday);
}

int main()
{
    char stm[11];
    struct tm tminfo;

    strcpy(stm, "2015-12-31");
    STRPTIME(stm, &tminfo);

    printf("tminfo %d-%d-%d\n", tminfo.tm_year, tminfo.tm_mon, tminfo.tm_mday);

    return(0);
}

1 个答案:

答案 0 :(得分:0)

问题在于你正在覆盖tminfo参数的指针。

tminfo = localtime( &rawtime );

函数参数就像一个局部变量:你可以覆盖它。它存在于堆栈中。但是你的来电者不会注意到这种变化。

你需要做这样的事情:

// Store the result in a temporary variable.
struct tm * tmp = localtime( &rawtime );
if ( tmp && tminfo ) {
    // Copy to caller's memory.
    memcpy( tminfo, tmp, sizeof( *tmp ) );
}