【问题标题】:C function returns pointer to a struct [duplicate]C函数返回指向结构的指针[重复]
【发布时间】:2015-08-29 10:41:47
【问题描述】:

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

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 函数的正确阶段是什么?

谢谢!

【问题讨论】:

    标签: c pointers struct malloc


    【解决方案1】:

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

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

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

    您要么需要立即缓存结果结构,要么使用斜体部分中提到的函数。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多