1

假设我有以下 C 代码:

void myfunction() {
    time_t     t = 0;
    struct tm  *ct;

    time(&t);
    ct = localtime(&t);
}

如您所见,该localtime函数返回一个指向struct tm变量的新指针。据我所知,要使函数返回的变量在调用者上下文中有效,它至少需要满足以下一项:

  1. 返回的变量必须在调用者的上下文或与调用者相关的更高上下文中声明。
  2. 返回的变量必须在堆上分配内存。

在我的情况下,第一点不适用,所以认为第二点得到满足是正常的。

我对吗?

如果是,这是否意味着我需要ct在使用变量后免费调用它?

如果没有,你能详细一点吗?

谢谢!


编辑:

从回复中,我了解到要求中应该有另一点是变量在返回的上下文中可用。那应该是静态变量。还有另一种可能吗?

4

3 回答 3

2

一些较旧的 C 函数返回指向静态缓冲区的指针。 localtime就是其中之一。您不需要(实际上也不应该;如果这样做,您可能会导致程序出现段错误)从localtime.

问题是进程空间中只有一个localtime缓冲区,下一次调用localtime(甚至在另一个线程中)会覆盖之前返回的结果。这就是为什么几乎所有以这种方式运行的函数(strtok另一个例子)现在都有新_r版本,将它们的结果放在用户传入的缓冲区中,因此是线程安全的。

于 2013-03-20T07:13:11.063 回答
1

不,您不需要释放它:

返回的值指向一个内部对象,其有效性或值可能会被任何后续调用 gmtime 或 localtime 更改。

资源

也就是说,如果你想保存这个函数的返回值,你应该手动把它保存在别处。

于 2013-03-20T07:11:57.123 回答
1

man localtime在 Linux 上逐字逐句:

四个函数 asctime()、ctime()、gmtime() 和 localtime() 返回指向静态数据的指针,因此不是线程安全的。

所以不,没有必要释放返回的值localtime(),更不用说你甚至不应该尝试释放它。

OT:为了保持线程安全,手册页指出:

线程安全版本 asctime_r()、ctime_r()、gmtime_r() 和 localtime_r() 由 SUSv2 指定,从 libc 5.2.5 开始可用。

于 2013-03-20T07:13:04.580 回答