C函数返回指向结构的指针

时间:2015-08-29 10:41:48

标签: c pointers struct malloc

我开始在C中学习Linux编程,我遇到了以下问题:

time_t now;
struct tm *local_time;

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

函数localtime,它是Linux API的一部分,接受一个指向time_t的指针,这很好,但为什么它会返回指向tm struct的指针?

我的问题是tm结构在初始化后如何管理?

如果localtime静态分配了结构,则无法保证在程序进行时不会覆盖结构,如果动态分配tm结构,则程序员必须调用{{1}不再需要结构。

那么返回指针的C函数的正确阶段是什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

根据manpage for localtime(为清晰起见而添加粗体和斜体):

  

localtime()函数将日历时间timep转换为相对于用户指定时区表示的细分时间表示。该函数就像调用tzset(3)一样,并将外部变量tzname设置为当前时区的信息,时区以协调世界时(UTC)与本地标准时间(以秒为单位)之差,如果是日光,则将日光设置为非零值储蓄时间规则适用于一年中的某些时段。 返回值指向静态分配的结构,可能会被后续调用任何日期和时间函数覆盖。 localtime_r()函数执行相同操作,但将数据存储在用户提供的结构。无需设置tzname,timezone和daylight。

粗体部分表示返回值的行为与您猜测的完全相同,后续调用可能会覆盖先前返回的结构。

您需要立即缓存生成的结构或使用斜体部分中提到的函数。

答案 1 :(得分:1)

凯文解释了问题是什么,并且你的假设是正确的。 对于此类功能,您可以应用简单的修复:

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