调用"localtime_s"时日历函数崩溃

Calendar function crashes when invoking 'localtime_s'

本文关键字:日历 函数 崩溃 localtime 调用      更新时间:2023-10-16

我正在尝试创建一个callendar,所以我使用time_t和localtime_s来存储时间和日期信息,然后将其存储在Calendar类的各个成员中:

void Callendar::Initialize()
{
    time_t now = time(0);
    tm *localTime = null;
    localtime_s(localTime, &now);
    LocalSeconds = localTime->tm_sec;
    LocalMinutes = localTime->tm_min;
    LocalHours = localTime->tm_hour;
    LocalDays = localTime->tm_mday;
    LocalMonths = localTime->tm_mon;
    LocalYears = localTime->tm_year;
    DaysSinceSunday = localTime->tm_wday;
    DaysSinceJanuaryFirst = localTime->tm_yday;
    HoursDaylightSavings = localTime->tm_isdst;
}

所有编译都很好,但在运行时我得到了:

调试断言失败!

程序:C:\Users\MyPC\Desktop\Framework\Framework\Debug\Framework.exe文件:f:\dd\vctools\crt_bld\self_x86\crt\src\locatim64.c行:69

表达式:(ptm!=NULL(

在我关闭失败的断言消息后,我在这一行得到了一个标准的调试错误:

static __inline errno_t __CRTDECL localtime_s(struct tm * _Tm, const time_t * _Time)
{
    return _localtime64_s(_Tm, _Time);
}

这基本上是调用*localtime_s(localtime,&now(;*的结果在日历中:Initialize((我是否可以使用此功能的弃用版本?我知道还有其他函数可以获取localtime,但我不知道哪一个是"合适的"函数。其他人建议我不应该使用"localtime",但localtime_s似乎也不起作用。

请参阅文档

参数

_tm

指向要填写的时间结构的指针。

这意味着函数期望第一个参数是指向有效tm实例的非null指针

更改

tm *localTime = null;
localtime_s(localTime, &now);

tm localTime;
localtime_s(&localTime, &now);

localtime_s函数需要一个已分配的struct tm指针,而您则向它传递一个空指针。

使用例如

tm localTime:
localtime_s(&localTime, &now);

ha!

#include <iostream>
#include <fstream>
#include <ctime>
//#include <string>
//#include <cstring>
//#include <sstream>
using namespace std;
int main ()
{
    int LocalSeconds, LocalMinutes,  LocalHours, LocalDays, LocalMonths, LocalYears,
        DaysSinceSunday, DaysSinceJanuaryFirst, HoursDaylightSavings;
    time_t now = time(0);
        tm localTime;
    now = time(NULL); 
    localtime_s(&localTime, &now);

    LocalSeconds = (&localTime)->tm_sec;
    LocalMinutes = (&localTime)->tm_min;
    LocalHours = (&localTime)->tm_hour;
    LocalDays = (&localTime)->tm_mday;
    LocalMonths = (&localTime)->tm_mon;
    LocalYears = (&localTime)->tm_year;
    DaysSinceSunday = (&localTime)->tm_wday;
    DaysSinceJanuaryFirst = (&localTime)->tm_yday;
    HoursDaylightSavings = (&localTime)->tm_isdst;
    cout << LocalSeconds << " " << LocalMinutes<< " " <<  LocalHours<< " " << LocalDays
        << " " << LocalMonths<< " " << LocalYears<< " " <<endl;
    return 0;
}

最近碰巧遇到了同样的问题。为了避免编译器错误/警告,我建议如下:

tm *localTime = new tm();
localtime_s(localTime, &now);

如果您不初始化localTime,您将得到一个"错误C4700:使用了未初始化的本地变量'localTime'">