以下代码
{
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
答案 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);
您还可以使用strcpy
或strdup
将其复制到您自己的不会被覆盖的字符串中。
这是另一个回答:Saving new points in time with ctime overwrites the old strings?