C语言 time_t 和 char* 变量意外被覆盖



以下代码

{
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);

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

这是另一个答案:使用 ctime 保存新时间点会覆盖旧字符串?

最新更新