2016-11-27 20 views
9

Tôi có một mảng thời gian ở đây:C++ struct tm & time_t

struct cl{ 
    unsigned char *buffer; 
    time_t t = time(0); 
    struct tm * ct = localtime(&t); 
}; 

và sau đó:

cl sadi[10]; 

Nhưng ví dụ tôi đã sadi[5] tại 21:58, và khi tôi nhận được một sadi[6] tại 21:59 . Sau đó, tôi kiểm tra lại tất cả sadi[].ct->tm_min của tôi là 59. vấn đề với đó là gì? Là nó không thể giữ được khoảnh khắc mà bạn nắm bắt nó, nó sẽ luôn luôn cập nhật? Nếu vậy, làm thế nào tôi có thể nắm bắt được thời điểm và nó không cập nhật như thế.

+0

Đó có phải là C++ hợp lệ không? Khi nào nó có thể khởi tạo thành viên của một cấu trúc như thế? –

+3

@ AndonM.Coleman Từ C++ 11. Bạn có thể khởi tạo thành viên trong lớp. – vsoftco

+0

như câu trả lời dưới đây, đó là sai lầm của tôi, tôi không nên khởi tạo một thành viên với con trỏ như thế trong trường hợp này, – VirusPTIT

Trả lời

15

dòng này:

struct tm* ct = localtime(&t); 

Vấn đề là các con trỏ rằng localtime(&t) lợi nhuận là một tĩnh đệm bên trong. Vì vậy, nó trả về chính xác cùng một giá trị con trỏ (địa chỉ) mỗi khi nó được gọi. Điều đó có nghĩa rằng tất cả các phần tử mảng của bạn có con trỏ đến cùng một đối tượng struct tm.

Một giải pháp là để thực hiện một bản sao của dữ liệu mỗi khi bạn gọi localtime:

struct cl { 
    unsigned char* buffer; 
    time_t t = time(0); 
    struct tm ct = *localtime(&t); 
}; 

Vì vậy, bây giờ tôi tuyên bố struct tm ct; (không phải là một con trỏ) và khởi tạo nó với giá trị dereferenced của con trỏ trả về *localtime(&t).

Các vấn đề liên quan