time_t和char *变量意外被覆盖

时间:2019-03-30 13:46:58

标签: c linux time ctime time-t

以下代码

{
    time_t t;
    t = time(NULL);
    char *A;
    A = ctime(&t);
    printf("%s -\n", A);
    sleep(2);
    time_t t1;
    t1 = time(NULL);
    printf("%s HERE A =\n", A);
    char *B = ctime(&t1);
    printf("%s HERE B =\n", B);
    printf("%s\n", B);
}

有输出

Sat Mar 30 19:10:33 2019
 -
Sat Mar 30 19:10:33 2019
 HERE A =
Sat Mar 30 19:10:35 2019
 HERE B =
Sat Mar 30 19:10:35 2019

那么变量A如何改变?我应该怎么做才能使A保持固定值

char *A;更改为const char *A;并没有帮助

预期

Sat Mar 30 19:10:33 2019
 -
Sat Mar 30 19:10:33 2019
 HERE A =
Sat Mar 30 19:10:33 2019
 HERE B =
Sat Mar 30 19:10:35 2019

1 个答案:

答案 0 :(得分:1)

因此,ctime返回一个指向字符串的指针。您正在将该指针分配给A和B。在这种情况下,它将返回相同的指针,这意味着A和B指向内存中的相同地址。如果添加代码以打印地址,则可以看到以下内容:

printf("A=0x%x, B=0x%x", A, B);

time的手册页说明,这是要注意的行为:

  

返回值指向静态分配的字符串,该字符串可能会被后续对任何日期和时间函数的调用所覆盖。该函数还使用有关当前时区的信息来设置外部变量tzname,时区和日光(请参阅tzset(3))。可重入版本ctime_r()进行相同的操作,但是将字符串存储在用户提供的缓冲区中,该缓冲区应至少有26个字节的空间。它不需要设置tzname,时区和日光。

因此,要解决此问题,可以使用ctime的可重入版本ctime_r

char C[27];
ctime_r(&t1, &C);

您还可以使用strcpystrdup将其复制到您自己的不会被覆盖的字符串中。

这是另一个回答:Saving new points in time with ctime overwrites the old strings?