C语言函数返回结构体指针

3

我开始学习Linux编程,使用C语言,遇到了以下问题:

time_t now;
struct tm *local_time;

now = time(NULL);
local_time = localtime(&now);

函数 localtime 是Linux API的一部分,接受一个指向 time_t 的指针是没问题的,但为什么它返回一个指向tm结构体的指针呢?
我的问题是,在初始化之后,tm 结构体是如何被管理的?
如果 localtime 静态地分配了该结构体,那么它不能保证在程序继续执行时该结构体不会被覆盖,而如果 tm 结构体是动态分配的,则程序员必须在不再需要该结构体时调用 free
那么,对于返回指针的 C 函数来说,什么才是正确的做法呢?
谢谢!
2个回答

5
根据 localtime 的 manpage(为了清晰加粗和斜体): localtime()函数将日历时间timep转换为按用户指定时区表示的分解时间表示。该函数的作用就像调用tzset(3)一样,并使用有关当前时区的信息设置外部变量tzname,使用协调世界时(UTC)与本地标准时间之间的差异来设置timezone(以秒为单位),如果在某些时候应用夏令时规则,则将daylight设置为非零值。返回值指向静态分配的结构,可能会被后续对任何日期和时间函数的调用覆盖。localtime_r()函数也是这样做的,但将数据存储在用户提供的结构中。它不需要设置tzname、timezone和daylight。
加粗部分表示返回值的行为与您猜测的完全相同,即后续调用可能会覆盖先前返回的结构。
您可以立即缓存生成的结构或利用斜体部分中提到的函数。

1

Kevin解释了问题所在,并且你的假设是正确的。对于这类函数,你可以应用简单的修复:

time_t now;
struct tm local_time;

now = time(NULL);
local_time = *localtime(&now);

localtime(&now) 返回后,静态分配的结构体的内容将被复制到本地结构体 local_time 中。

编辑:还有很多其他要说的事情:

  1. 您仍然在使用函数之间存在问题...
  2. 在许多实现中,同一缓冲区在 mktimegmtime 之间共享,因此使用这些函数也可能会修改结构体。
  3. C99 和 C11 提供了更安全的函数 [TR 24731-1]。

    localtime_s(const time_t * restrict timer, struct tm * restrict dst);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接