3

glibc ctime() の仕組みについて質問があります。

私のスニペットに従います:

#include    <stdio.h>
#include    <time.h>
#include    <stdlib.h>


int main (int argc,char** argv)
{
    int ret=EXIT_SUCCESS;

    time_t tm1;
    time_t tm2;


    tm1 = time(NULL);
    tm2 = tm1 + 60; // 60 seconds later


    puts("1st method-------");
    printf("tm1 = %stm2 = %s",ctime(&tm1),ctime(&tm2));


    puts("2nd method-------");
        printf("tm1 = %s",ctime(&tm1));
    printf("tm2 = %s",ctime(&tm2));

    return(ret);
}

私が得た:

1st method-------
tm1 = Sat Jan 14 01:13:28 2012
tm2 = Sat Jan 14 01:13:28 2012
2nd method-------
tm1 = Sat Jan 14 01:13:28 2012
tm2 = Sat Jan 14 01:14:28 2012

ご覧のとおり、最初の方法では両方の tm が同じ値を持っていますが、これは正しくありません。2番目の方法では、正しい値が得られました。ctime() はこれらの文字列を静的バッファーに入れることを知っています。それを上書きするには、ctime() を連続して呼び出す必要があります。

Q: 1stメソッドで連呼しないの?

返信ありがとうございます。

4

1 に答える 1

3

問題を解決するために必要なすべての情報を提供しました。

2番目の方法は、期待どおりに機能します。ctimeが呼び出され、バッファーがいっぱいになり、結果が出力されます。その後、このプロセスが繰り返されます。したがって、2つの異なる時間が印刷されます。

最初の方法では、順序が異なります。ctimeが呼び出され、次に再度呼び出されてから、結果が出力されます。ctimeの各呼び出しの結果は、少なくともprintfに関する限り、同じです。つまり、静的バッファーのアドレスです。ただし、そのバッファーの内容は呼び出しごとに変更され、printfは両方のctime呼び出しが完了するまでバッファーを調べないため、新しい内容を2回出力することになります。

したがって、最初のメソッドで両方の呼び出しを行っています。最初の呼び出しの結果は、印刷される前に上書きされます。

于 2012-01-14T01:29:01.683 に答える