我有像下面这样的代码。它显示当前日期和100天后的日期。然而,我注意到结果是一样的。所以我认为可能结构或变量的地址是相同的。
我放了变量now,later,lnow和tnow的"%p",最下面的结果显示lnow和tnow的结构指针都是02B51AA0,而变量later和now有不同的地址。现在,如果我把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发布于 2017-12-08 13:18:55
now和later的地址?这些只是time_t值,因此address is useless.localtime返回指向内部缓冲区的指针-每次都相同,因此如果您想在第二次执行localtime操作,则需要将值复制出来。发布于 2017-12-08 22:28:03
标准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)
...https://stackoverflow.com/questions/47708099
复制相似问题