【问题标题】:mktime() overwrite time_t in Cmktime() 覆盖 C 中的 time_t
【发布时间】:2020-06-06 16:18:51
【问题描述】:

我对 c: 中的 mktime 有疑问

time_t t_fim;
time(&t_fim);

struct tm* p_fim;
struct tm* c_fim;
p_fim = localtime(&t_fim);
c_fim = localtime(&t_fim);

......

p_fim->tm_year = ano-1900;
p_fim->tm_mon = mes-1;
p_fim->tm_mday = dia;
//here the p_fim date is good

c_fim->tm_mday -=47;
mktime(c_fim);

printf("Pascoa %d %d %d\n", p_fim->tm_mday, p_fim->tm_mon + 1, p_fim->tm_year + 1900);
printf("Carnaval %d %d %d\n", c_fim->tm_mday, c_fim->tm_mon+1, c_fim->tm_year + 1900);

//here the c_fim is good with -47 days but the `p_fim` is now equal with `c_fim`

mktime 改变了p_fim 的值,如何解决?

【问题讨论】:

  • 您认为您的p_fimc_fim 变量指向哪里?在您显示的代码中,它们从不初始化或以其他方式设置为指向有效内存。
  • 我现在编辑了代码
  • 好吧,您应该阅读localtime 的文档,尤其是说:“返回的值指向一个内部对象,其有效性或值可能会被任何后续调用更改gmtime 或本地时间。”

标签: c mktime


【解决方案1】:

尝试摆脱指针

struct tm p_fim;
struct tm c_fim;
p_fim = *localtime(&t_fim);
c_fim = *localtime(&t_fim);

或者,如果您使用的是 POSIX 系统,请改用localtime_r()

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多