2016-11-27 48 views
9

私はここでの時間の配列を持っている:C++のstruct tmの&のtime_t

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

、その後:

cl sadi[10]; 

しかし、例えば、私は21:58sadi[5]を得た、と私は21:59sadi[6]を得たとき。 次に、sadi[].ct->tm_minがすべて59であることを再度確認します。その問題は何ですか?それはあなたがそれをキャプチャする瞬間を保持することはできません、それは常に更新されますか?もしそうなら、私はその瞬間をどのようにして捕らえることができますか?

+0

それは有効なC++ですか?そのような構造体のメンバーを初期化することはいつ可能になりましたか? –

+3

@ AndonM.Coleman C++ 11以降。クラス内のメンバの初期化を行うことができます。 – vsoftco

+0

私の間違いだったので、この場合はポインタを使ってメンバを初期化してはいけません – VirusPTIT

答えて

15

この行:

struct tm* ct = localtime(&t); 

問題がポインタlocaltime(&t)その戻り静的内部バッファであることです。したがって、呼び出されるたびに同じポインタ値(アドレス)を返します。つまり、すべての配列要素に同じstruct tmオブジェクトへのポインタがあります。

一つの解決策は、データのコピーあなたがlocaltimeを呼び出すたびにすることです:

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

だから今、私はstruct tm ct;(ないポインタ)を宣言しての間接参照値でそれを初期化します返されたポインタ*localtime(&t)