2016-11-27 5 views
9

Ich habe eine Reihe von Zeit hier:C++ struct tm & Time_t

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

und dann:

cl sadi[10]; 

Aber zum Beispiel habe ich sadi[5] bei 21:58, und als ich ein sadi[6] bei 21:59 . Dann überprüfe ich nochmal alle meine sadi[].ct->tm_min sind 59. Was ist das Problem damit? Kann es den Moment nicht halten, dass Sie es erfassen, wird es immer aktualisiert? Wenn ja, wie kann ich den Moment der Zeit erfassen und es nicht so aktualisieren.

+0

Ist das überhaupt gültig C++? Wann wurde es möglich, Mitglieder einer solchen Struktur zu initialisieren? –

+3

@ AndonM.Coleman Seit C++ 11. Sie können eine Init-Member-Initialisierung durchführen. – vsoftco

+0

wie die Antwort unten, das war mein Fehler, ich sollte ein Mitglied mit Zeiger so in diesem Fall nicht initialisieren, – VirusPTIT

Antwort

15

diese Zeile:

struct tm* ct = localtime(&t); 

Das Problem ist, dass die Zeiger dass localtime(&t) kehrt ein statischen interner Puffer ist. Es gibt also bei jedem Aufruf genau den gleichen Zeigerwert (Adresse) zurück. Das bedeutet, dass alle Array-Elemente Zeiger auf dasselbe struct tm-Objekt haben.

Eine Lösung ist eine Kopie der Daten jedes Mal, wenn localtime rufen zu machen: Ich erkläre struct tm ct; (kein Zeiger) und initialisieren es mit dem der So, jetzt

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

dereferenzierte Wert zurückgegebener Zeiger *localtime(&t).