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

C function returns pointer to a struct

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
time_t now;
struct tm *local_time;

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

函数localtime是LinuxAPI的一部分,它接受指向time_t的指针,这很好,但是为什么它返回指向tm结构的指针?

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

如果localtime静态地分配了结构,它不能保证在程序继续运行时不会覆盖结构,如果tm结构是动态分配的,那么程序员必须调用free,不再需要结构。

那么返回指针的C函数的正确相位是什么呢?

谢谢!


根据本地时间的手册页(为了清晰起见,添加了粗体和斜体):

The localtime() function converts the calendar time timep to broken-down time representation, expressed relative to the user's specified timezone. The function acts as if it called tzset(3) and sets the external variables tzname with information about the current timezone, timezone with the difference between Coordinated Universal Time (UTC) and local standard time in seconds, and daylight to a nonzero value if daylight savings time rules apply during some part of the year. The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions. The localtime_r() function does the same, but stores the data in a user-supplied struct. It need not set tzname, timezone, and daylight.

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

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


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

1
2
3
4
5
time_t now;
struct tm local_time;

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

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

编辑:还有很多事情要说:

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

    江户十一〔四〕号