1

私は正しい答えを知っていると思う次のパズルがありますが、1つの問題もあります。見てください:

Sample Code 
void printTime( time_t *t ) 
{ 
???? 
} 

???? を置き換えることができるのは、次のうちどれですか。上記のコードで、 t に渡された時間を人間が読める形式で出力しますか?

  1. :

    char s[ 100 ];
    ctime( t, s ); 
    printf( "%s\n", s ); 
    
  2. :

    printf( "%s\n", ctime( t ) ); 
    
  3. :

    printf( "%s\n", asctime( t ) ); 
    
  4. :

    printf( "%s", t ); 
    
  5. :

    char *s = ctime( t ); 
    printf( "%s\n", s ); 
    free( s ); 
    

私の答えは答え 2 です (関数 ctime は入力として time_t ポインターを取り、printf で出力できる文字列へのポインターを返します)。

回答 5 のコードはコンパイル時に同様に機能しますが、以前にストレージが割り当てられていないのになぜ free() を使用するのでしょうか? それが答え5が間違っている理由だと思いますか?

ありがとう、プレゼメク

4

1 に答える 1

3
  1. この方法では機能しませんctime_r 。代わりに使用してください。
  2. 動作し、正しいです。
  3. 間違った型です。最初にこれを変換する必要があります。たとえば、localtime.
  4. 間違った可変長の型です。char*予期されていましたが、time_t*与えられました。
  5. ctime静的バッファを使用するなど、バッファ自体を管理するため、不適切な解放。

一般に、これらの関数 (つまりasctimectimelocaltime…) のほとんどは、最近 2 つのバリアントで提供されます。戻り値を保持するために静的に割り当てられたバッファーを使用する歴史的な形式と、 reentrant を表す接尾辞が付いたより現代的なバージョン_rです。後者の場合、出力バッファを自分で提供する必要があります。つまり、割り当ては自分で行う必要があります。大きな利点は、複数のスレッドが再入可能バージョンを同時に使用できることです。互いの結果を上書きする心配はありません。

于 2013-01-17T14:02:39.267 に答える