0

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

  1 #include <stdio.h>
  2 #include <time.h>
  3 
  4 int main() {
  5     struct tm *info1;                                                                                                                                      
  6     struct tm *info2;
  7     unsigned long i = 100000000;
  8     unsigned long j = 200000000;
  9     
 10     info1 = localtime((time_t *) &i);
 11     info2 = localtime((time_t *) &j);
 12     
 13     printf("%s(): info1->tm_sec = %d\n", __func__, info1->tm_sec);
 14     printf("%s(): info1->tm_min = %d\n", __func__, info1->tm_min);
 15     printf("%s(): info1->tm_hour = %d\n", __func__, info1->tm_hour);
 16     printf("%s(): info1->tm_mday = %d\n", __func__, info1->tm_mday);
 17     printf("%s(): info1->tm_mon = %d\n", __func__, info1->tm_mon);
 18     printf("%s(): info1->tm_year = %d\n", __func__, info1->tm_year);
 19     
 20     printf("%s(): info2->tm_sec = %d\n", __func__, info2->tm_sec);
 21     printf("%s(): info2->tm_min = %d\n", __func__, info2->tm_min);
 22     printf("%s(): info2->tm_hour = %d\n", __func__, info2->tm_hour);
 23     printf("%s(): info2->tm_mday = %d\n", __func__, info2->tm_mday);
 24     printf("%s(): info2->tm_mon = %d\n", __func__, info2->tm_mon);
 25     printf("%s(): info2->tm_year = %d\n", __func__, info2->tm_year);
 26     
 27     
 28 
 29     return 0;
 30 }

出力は次のとおりです。

main(): info1->tm_sec = 20
main(): info1->tm_min = 33
main(): info1->tm_hour = 3
main(): info1->tm_mday = 4
main(): info1->tm_mon = 4
main(): info1->tm_year = 76
main(): info2->tm_sec = 20
main(): info2->tm_min = 33
main(): info2->tm_hour = 3
main(): info2->tm_mday = 4
main(): info2->tm_mon = 4
main(): info2->tm_year = 76

7 行目と 8 行目は、呼び出し元の関数から渡された unsigned long としての実際のタイムスタンプ (エポックからの秒数) です (ここではハードコーディングしました)。

10 行目と 11 行目が気になります。struct tm2 つのタイムスタンプiとの情報を取得する必要がありjます。基本的に、 の月を取得して の月info1と比較する必要がありますinfo2

13 行目から 25 行目までの出力を実行するinfo1info2、同じ値 (つまり、同じ秒、同じ分、同じ時間など) が返されます。

2 つの質問:

  1. なぜそれらは同じ値を持っているのですか?
  2. info1との異なる値を取得するにはどうすればよいinfo2ですか?
4

2 に答える 2

1

ドキュメントには、その理由が明確に記載されています。

asctime()、ctime()、gmtime()、および localtime() の 4 つの関数は、静的データへのポインターを返すため、スレッドセーフではありません。

つまり、各呼び出しで標準ライブラリが所有する同じ静的構造体へのポインターを取得しています。これを防ぐには、データをコピーする必要があります。

于 2013-04-18T09:04:01.167 に答える