c - 内存分配?

标签 c pointers memory

我的代码如下所示。它显示当前日期和 100 天后的日期。但是,我注意到结果是一样的。所以我想也许结构或变量的地址是相同的。

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

#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

最佳答案

  1. 为什么要打印nowlater 的地址?这些只是 time_t 值,因此地址没有用。
  2. localtime 返回一个指向内部缓冲区的指针 - 每次都相同,因此如果您想立即执行 localtime,则需要从中复制值时间。

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

相关文章:

c - 解释c中near、far和huge指针的区别?

来自字符串的指针 golang

memory - 如何设置OpenCL的本地工作空间大小?

c - 我应该管理页面还是只依赖虚拟内存?

c - 编写一个使用数组从 100 个随机数列表中查找最大和最小数字的 C 程序

c - 访问冲突写入位置插入数组

c - fscanf 在此 C 代码中失败

c - 声明中带有指针的函数。为什么?

c - 获取文本以在C中逐字符打印

memory - 现代处理器上的并行内存访问