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

Aka*_*ash 36 c struct pointers function

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

我碰到:

struct tm * _Cdecl localtime(const time_t *__timer);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Mys*_*ial 46

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

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

该结构由gmtime和localtime函数静态分配和共享.每次调用其中一个函数时,都会覆盖此结构的内容.

编辑:附加评论中提到的一些内容.

这种共享数据结构的直接结果是,localtime类似的函数不是线程安全的.线程安全的解决方案因不同的平台而异.localtime_r适用于POSIX和localtime_sMSVC.

  • @OliCharlesworth实际上它有,读取(C99,7.23.3时间转换函数)"除了strftime函数之外,这些函数每个都返回一个指向两种静态对象之一的指针[...]执行任何函数返回指向其中一个对象类型的指针可能会覆盖任何先前调用它们返回的值所指向的相同类型的任何对象中的信息." (6认同)

Mat*_*lia 11

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

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

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

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

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

  • 哇,你说得好!我正是这样做的:测量“date_before”和“date_after”并比较它们。现在事实证明我正在比较相同的变量!我确认“date_before”和“date_after”的打印地址给出相同的值。 (3认同)

Kos*_*Kos 5

该手册页说:

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

也:

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