Elle renvoie un pointeur vers un morceau de mémoire allouée statiquement (probablement soit un static
variable définie dans localtime
ou un global défini quelque part dans la bibliothèque d'exécution C). Vous ne devez pas libérer une telle mémoire.
Évidemment, cette fonction n'est pas réentrante (mais peut être thread-safe si TLS est utilisé).
Vous devez être prudent lorsque vous utilisez ce pointeur : ne faites jamais d'appels de fonction qui pourraient appeler localtime
/ gmtime
/... avant d'avoir fini d'utiliser ce pointeur, sinon le contenu de la mémoire référencée par votre pointeur pourrait changer (en réponse au nouvel appel à localtime
) et vous lirez des valeurs relatives à une autre time_t
.
En général, la conception de la bibliothèque date/heure est assez dépassée, ce genre d'optimisation valait la peine lorsque le langage C a été conçu, aujourd'hui elle ne pose que des problèmes.
Pour résoudre ces problèmes, il existe au moins deux versions améliorées différentes de ces fonctions : localtime_r
(SUSv2, r
séjours pour "réentrant") et localtime_s
(Microsoft, s
reste pour "sûr"). La triste réalité pour la portabilité est que ceux-ci font presque la même chose (ils exigent que la destination struct tm
à passer en tant que paramètre), mais diffèrent dans le nom et l'ordre des paramètres.