4

私はこのコードを持っています:

time_t tt = time(NULL);
tm* currentTime = gmtime(&tt);
tm* storedTime = gmtime(&m_time);

m_time は、構築時の time_t メンバ データ セットです。このデータ メンバーで storedTime を設定すると、両方の tm ポインターが同じ変数を指しているかのように、現在の時刻は同じ値を取得します。これは予想される動作ですか?tm 構造体を分離して時間を比較するにはどうすればよいですか?

ありがとう

4

2 に答える 2

5

に関するドキュメントからgmtime

この構造体は、関数 gmtime および localtime によって静的に割り当てられ、共有されます。これらの関数のいずれかが呼び出されるたびに、この構造体の内容が上書きされます

次のコードを使用してコピーを作成します。

time_t tt = time(NULL);

tm currentTime = *gmtime(&tt);
tm storedTime = *gmtime(&m_time);

(ここでのポインタ参照は と同等ですmemcpy(&currentTime, gmtime(&tt), sizeof(tm)))

于 2012-05-10T09:13:04.670 に答える
1

ローカル静的変数のアドレスを返している可能性があります。例えば

struct tm *gmtime(struct time_t *tt)
{
    static struct tm local_tm;
    /* do work */
    return &local_tm;
}

インターネット上の man ページ (私は "man gmtime" をググってみました) を見ると、これは再入可能な関数ではなく、戻り値を他の関数と共有することさえあるという共通のテーマがあります。

POSIX.1-2001 は次のように述べています: 「asctime()、ctime()、gmtime()、および localtime() 関数は、2 つの静的オブジェクトのいずれかで値を返します: 分解された時間構造体と char 型の配列。実行関数のいずれかが、他の関数によってこれらのオブジェクトのいずれかに返された情報を上書きする可能性があります。」

于 2012-05-10T09:15:01.630 に答える