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

C 函数返回指向结构的指针,c,pointers,struct,malloc,C,Pointers,Struct,Malloc,我已经开始在C中学习Linux编程,遇到了以下问题: time_t now; struct tm *local_time; now = time(NULL); local_time = localtime(&now); 函数localtime是Linux API的一部分,它接受指向time\u t的指针,这很好,但是为什么它返回指向tmstruct的指针呢 我的问题是tm结构在初始化后如何管理 如果localtime静态分配了结构,则不能保证在程序运行时不会覆盖该结构;如果tm结构是

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

time_t now;
struct tm *local_time;

now = time(NULL);
local_time = localtime(&now);
函数
localtime
是Linux API的一部分,它接受指向
time\u t
的指针,这很好,但是为什么它返回指向
tm
struct的指针呢

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

如果
localtime
静态分配了结构,则不能保证在程序运行时不会覆盖该结构;如果
tm
结构是动态分配的,则程序员必须调用
free
该结构不再需要

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

谢谢

根据(为清晰起见添加了粗体和斜体):

函数的作用是:将日历时间timep转换为相对于用户指定时区表示的细分时间表示形式。该函数的作用就像调用tzset(3)一样,并将外部变量tzname设置为当前时区、协调世界时(UTC)与本地标准时间(以秒为单位)之差的时区,以及如果夏令时规则在一年中的某个时间段适用,则将日光设置为非零值返回值指向一个静态分配的结构,该结构可能会被任何日期和时间函数的后续调用覆盖。localtime\u r()函数也会这样做,但会将数据存储在用户提供的结构中。它不需要设置名称、时区和日光

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


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

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

time_t now;
struct tm local_time;

now = time(NULL);
local_time = *localtime(&now);
localtime(&now)
返回时,静态分配结构的内容将复制到本地结构
local\u time

编辑:还有很多话要说:

  • 在线程之间使用函数仍然有问题
  • 在许多实现中,
    mktime
    gmtime
    之间共享相同的缓冲区,因此使用这些缓冲区也可以修改结构
  • C99和C11提供了更安全的功能[TR 24731-1]

    localtime(const time*restrict timer,struct tm*restrict dst)