4

次のコードを実行します。

  1 #include <iostream>
  2 int main(int argc, char** argv)
  3 {
  4     time_t t1 = time(0);
  5     time_t t(0);
  6     std::cout<<"BUG LINE"<<std::endl<< ctime(&t) << ctime(&t1) ;
  7     std::cout<<"PRINTS FINE HERE"<<std::endl;
  8     std::cout<< ctime(&t);
  9     std::cout<< ctime(&t1);
 10     return 0;
 11 }

ビルド: g++ test1.cpp

Output:
./a.out
BUG LINE
Thu Jan  1 01:00:00 1970
Thu Jan  1 01:00:00 1970
PRINTS FINE HERE
Thu Jan  1 01:00:00 1970
Wed Jul 10 16:31:48 2013

コードの #6 でストリームがおかしくなるのはなぜですか??

4

4 に答える 4

3

この関数は文字列バッファーをctime返しますstatic- したがって、返される文字列は毎回まったく同じ文字列になります)。これは、同じ行で複数回呼び出すと、未定義の動作が発生することを意味します (C および C++ 標準では、呼び出しの順序がわからないため)。作られています)。

解決策は、2 つの別個のステートメントを (;その間に) 呼び出すか、リエントラント セーフなバリアントを使用して、バッファーを渡して結果を格納することです)。ctime_r

于 2013-07-10T15:47:23.263 に答える