以下代码
{
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("%sn", 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
因此,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
将其复制到您自己的字符串中,该字符串不会被覆盖。
这是另一个答案:使用 ctime 保存新时间点会覆盖旧字符串?