如何在C中分配localtime的结果结构?

时间:2012-01-01 17:18:33

标签: c function pointers struct

我正在使用C中的time.h文件来帮助我们处理时间/日期功能。

我遇到了:

struct tm * _Cdecl localtime(const time_t *__timer);

...似乎返回一个指向tm结构的指针。我发现按地址返回主要用于返回新的内存分配。

如果是这样,上述返回实际上是如何工作的(struct tm的返回地址)。返回的对象是否定义在某处?

由于

6 个答案:

答案 0 :(得分:44)

localtime(以及其他一些函数)返回的指针实际上是指向静态分配内存的指针。 所以你不需要释放。此外,你不应该释放它。

http://www.cplusplus.com/reference/clibrary/ctime/localtime/

  

此结构由函数静态分配和共享   gmtime和localtime。每次这些功能中的任何一个都是   被称为该结构的内容被覆盖。

编辑:在评论中附加一些内容。

这种共享数据结构的直接结果是localtime和类似的函数不是线程安全的。线程安全的解决方案因不同的平台而异。 localtime_r for POSIXlocaltime_s for MSVC

答案 1 :(得分:11)

它返回一个指向静态分配内存的指针(可能是static中定义的localtime变量或C运行时库中某处定义的全局变量。你不能释放这样的记忆。

显然这个函数不是可重入的(但如果使用TLS则可以是线程安全的。)

使用此指针时必须小心:在完成使用该指针之前,永远不要进行任何可以调用localtime / gmtime / ...的函数调用,否则引用的内存内容您的指针可能会更改(响应对localtime的新调用),您将读取相对于另一个time_t的值。

一般来说,日期/时间库的设计已经过时了,这种优化在设计C语言时是值得的,现在它只会产生问题。

要解决这些问题,这些功能至少有两个不同的改进版本:localtime_r(SUSv2,r停留为“可重入”)和localtime_s(Microsoft,{{1保持“安全”)。可移植性的可悲事实是它们几乎完全相同(它们需要将目标s作为参数传递),但参数的名称和顺序不同。

答案 2 :(得分:5)

man page说:

  

返回值指向静态分配的结构,可能会被后续调用任何日期和时间函数覆盖。

此外:

  

localtime_r()函数执行相同操作,但将数据存储在用户提供的结构中。它不需要设置tzname,timezone和daylight。

答案 3 :(得分:3)

实际上localtime通常会返回静态对象的地址。我怀疑它看起来像这样:

struct tm *
localtime(const time_t *timer)
{
    static struct tm tm;

    /* Magic. */

    return &tm;
}

答案 4 :(得分:3)

它们返回指向库本地静态结构的指针。从手册页:

NOTES

The  four functions asctime(), ctime(), gmtime() and localtime() return
a pointer to static data and hence are  not  thread-safe.   Thread-safe
versions asctime_r(), ctime_r(), gmtime_r() and localtime_r() are spec‐
ified by SUSv2, and available since libc 5.2.5.

POSIX.1-2001 says: "The asctime(), ctime(), gmtime(),  and  localtime()
functions  shall  return values in one of two static objects: a broken-
down time structure and an array of type char.  Execution of any of the
functions  may  overwrite  the  information returned in either of these
objects by any of the other functions."  This can occur  in  the  glibc
implementation.

答案 5 :(得分:0)

localtime函数返回的指向对象具有静态存储持续时间。