我有如下代码。它显示当前日期和100天后的日期。然而,我注意到结果是一样的。所以我想也许结构或变量的地址是一样的。
我把变量"%p"nowlaterlnowtnow放在最下面的结果表明,lnowtnow的结构指针都是02B51AA0,而变量laternow的地址不同。
现在,如果我在第一个switch语句之后将lnow = localtime(&later)移动到不同的位置,那么地址会发生变化,并且工作得很好。你能解释一下为什么会这样吗?

#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;
}

结果
0061FF2C 0061FF28
02B51AA0 02B51AA0
2017.12.8 ELSE
2017.12.8 ELSE

最佳答案

为什么要打印nowlater的地址?这些只是time_t值,所以地址是无用的。
localtime返回一个指向内部缓冲区的指针-每次都是相同的,因此如果您想第二次执行localtime操作,则需要从中复制值。

关于c - 内存分配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47708099/

10-08 22:55