首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存分配?

内存分配?
EN

Stack Overflow用户
提问于 2017-12-08 13:12:20
回答 2查看 72关注 0票数 1

我有像下面这样的代码。它显示当前日期和100天后的日期。然而,我注意到结果是一样的。所以我认为可能结构或变量的地址是相同的。

我放了变量nowlaterlnowtnow"%p",最下面的结果显示lnowtnow的结构指针都是02B51AA0,而变量laternow有不同的地址。现在,如果我把lnow = localtime(&later)移到不同的位置,在第一个switch语句之后,地址改变了,它就完美地工作了。你能解释一下为什么会发生这种情况吗?

代码语言:javascript
复制
#include <stdio.h>
#include <time.h>
struct tm* tnow;
struct tm* lnow;

int main(void) 
{
    time_t now = time(NULL);

    time_t later = now + 100*24*3600;
    printf("%p\t%p\n", &now, &later);
    lnow = localtime(&later);
    tnow = localtime(&now);
    printf("%p\t%p\n", lnow, tnow);
    printf("%d.%d.%d\t", tnow->tm_year+1900, tnow->tm_mon+1, tnow->tm_mday);
    switch (tnow->tm_wday)
    {
        case 0: puts("SUNDAY"); break;
        case 1: puts ("MONDAY"); break;
        case 2: puts("TUESDAY"); break;
        default: puts("ELSE"); break;
    }

    printf("%d.%d.%d\t", lnow->tm_year+1900, lnow->tm_mon+1, lnow->tm_mday);
    switch (lnow->tm_wday)
    {
        case 0: puts("SUNDAY"); break;
        case 1: puts ("MONDAY"); break;
        case 2: puts("TUESDAY"); break;
        default: puts("ELSE"); break;
    }

    return 0;
}

结果:

代码语言:javascript
复制
0061FF2C 0061FF28 
02B51AA0 02B51AA0
2017.12.8 ELSE
2017.12.8 ELSE
EN

回答 2

Stack Overflow用户

发布于 2017-12-08 13:18:55

  1. 为什么要打印nowlater的地址?这些只是time_t值,因此address is useless.
  2. localtime返回指向内部缓冲区的指针-每次都相同,因此如果您想在第二次执行localtime操作,则需要将值复制出来。
票数 3
EN

Stack Overflow用户

发布于 2017-12-08 22:28:03

标准C库有3个函数ctime()gmtime()localtime(),它们都使用相同的static struct tm对象。对它们中任何一个的调用或重复调用,都将重用相同的对象。

下面的调用要么返回NULL (如果转换失败),要么返回指向同一对象的指针。struct tm对象可以在每次调用时被重写。

任何返回指向这些对象类型之一的指针的函数的

执行都可能覆盖任何相同类型的对象中的信息,这些对象是由先前对其中任何一个的调用返回的值所指向的。C11dr§7.27.3 1

代码语言:javascript
复制
struct tm *lnow = localtime(&later);
struct tm *tnow = localtime(&now);
struct tm *foo = gmtime(&now);

若要保留结果,请复制由返回的指针引用的对象。错误检查也是一个好主意。

代码语言:javascript
复制
struct tm *tm_ptr = localtime(&later);
if (tm_ptr == NULL) {
  fprintf(stderr, "Bad later time\n");
  exit(EXIT_FAILURE);
}
struct tm lnow = *tm_ptr;  // copy the broken-down time
switch (lnow.tm_wday) 
  ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47708099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档