Nó trả về một con trỏ đến một mảnh bộ nhớ tĩnh được phân bổ (có thể hoặc là một biến static
định nghĩa bên localtime
hoặc toàn cầu được xác định ở đâu đó trong thư viện runtime C). Bạn không được miễn phí bộ nhớ đó.
Rõ ràng chức năng này không phải là reentrant (nhưng có thể được thread-an toàn nếu TLS được sử dụng).
Bạn phải cẩn thận khi sử dụng con trỏ này: không bao giờ thực hiện bất kỳ cuộc gọi chức năng mà có thể gọi localtime
/gmtime
/... trước khi bạn đã hoàn thành sử dụng con trỏ đó, nếu không thì nội dung của bộ nhớ được tham chiếu bởi con trỏ của bạn có thể thay đổi (trong phản ứng với cuộc gọi mới tới localtime
) và bạn sẽ được đọc các giá trị liên quan đến một số khác time_t
.
Nói chung, thiết kế của thư viện ngày/giờ khá lạc hậu, kiểu tối ưu này đáng giá khi ngôn ngữ C được thiết kế, ngày nay nó chỉ gây ra vấn đề.
Để giải quyết những vấn đề này có ít nhất hai phiên bản khác nhau cải thiện các chức năng: localtime_r
(SUSv2, r
ở lại cho "lõm") và localtime_s
(Microsoft, s
ở lại cho "an toàn").Thực tế đáng buồn cho tính di động là chúng gần như giống nhau (chúng yêu cầu đích struct tm
được chuyển thành tham số), nhưng khác nhau về tên và thứ tự của các tham số.
Nguồn
2012-01-01 17:21:01
Bạn xác định và phân bổ cấu trúc tm *** trong mã của bạn. *** localtime() lưu trữ kết quả của nó trong cấu trúc đó và trả về một con trỏ tới cùng cấu trúc đó. Điều này có thể có vẻ dư thừa nhưng nó tiện dụng vào các thời điểm để có được con trỏ trở lại, mặc dù bạn biết nơi struct là. –
@PeteWilson - Um, không, bạn không biết. Vui lòng xem câu trả lời bên dưới. Những gì bạn mô tả chỉ là trường hợp trong phiên bản '_r' của cuộc gọi (' localtime_r() ') từ SUSv2 hoặc phiên bản' _s' của cuộc gọi trong MSVC –
có thể trùng lặp của [Không trả về struct của localtime() cần phải được giải phóng?] (http://stackoverflow.com/questions/6210880/does-returned-struct-of-localtime-need-to-be-freed) –