内存分配?

时间:2017-12-08 05:12:20

标签: c pointers memory

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

我将"%p"变量nowlaterlnowtnow放在一起,最底部的结果显示{{1}的结构指针1}}和lnow都是tnow,而变量02B51AA0later具有不同的地址。 现在,如果我将now移动到不同的位置,在第一个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;
}

2 个答案:

答案 0 :(得分:3)

  1. Why are you printing the address of now and later ? These are just time_t values so the address is useless.
  2. localtime returns a pointer to an internal buffer - the same each time, so you need to copy the values out of it if you want to do localtime on a second time.

答案 1 :(得分:0)

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

以下调用返回NULL(如果转换失败)或指向相同对象的指针。每次调用都可能覆盖struct tm个对象。

  

执行任何返回指向这些对象类型之一的指针的函数可能会覆盖任何先前调用它们返回的值所指向的相同类型的任何对象中的信息......C11dr§7.27 .3 1

struct tm *lnow = localtime(&later);
struct tm *tnow = localtime(&now);
struct tm *foo = gmtime(&now);

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

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) 
  ...