It returns a pointer to a piece of statically allocated memory (probably either a static
variable defined inside localtime
or a global defined somewhere in the C runtime library). You must not free such memory.
Obviously this function is not reentrant (but can be thread-safe if TLS is used).
You must be careful when using this pointer: never make any function calls that could call localtime
/gmtime
/... before you finished using that pointer, otherwise the content of the memory referenced by your pointer could change (in response to the new call to localtime
) and you will be reading values relative to another time_t
.
In general the design of the date/time library is quite outdated, this kind of optimization was worthwhile when the C language was designed, nowadays it only gives problems.
To address these problems there are at least two different improved versions of these functions: localtime_r
(SUSv2, r
stays for "reentrant") and localtime_s
(Microsoft, s
stays for "safe"). The sad fact for portability is that these do almost the same thing (they require the destination struct tm
to be passed as a parameter), but differ in name and ordering of the parameters.