1

OSX 上の Linux 用に設計された (と私は信じています) コードをコンパイルすると、エラーが発生します。この問題をコードのこのセクションまで追跡しました。

TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';

fprintf(LOG, "[ %20s] ", TIMESTRING);

これが当てはまる理由はありますか?を含め<time.h>ました。

4

2 に答える 2

4

ctime特定のサイズの静的に割り当てられたバッファーを使用しているため、最初の問題は、サイズを知らずにその文字列に追加していることです。

TIMESTRING[24]=' ';

バッファーが 24 バイトしかない場合、これによりセグメンテーション違反が発生する可能性があります。もう 1 つの原因として、ゼロ終端がたまたまインデックス 24 にある場合、文字列をfprintf非終端にしただけで、読み取りが許可されていないメモリに到達するまで読み取りを続行し、segfault が発生する可能性があります。

事前に割り当てられたバッファーを変更する場合は、バッファーを使用ctime_rし、バッファーがデータを保持するのに十分な大きさであること、および使用後にゼロで終了することを確認してください。ctime_r利用できない場合は、strncpy変更する前に独自のバッファーに対して a を実行します。

HTH

編集

あなたが何をしようとしているのか正確にはわかりませんが、投稿したコードがアプリケーションから直接取得されたと仮定すると、おそらく実際にこれを実行しようとしています:

TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);

fprintf(LOG, "[ %20s ] ", TIMESTRING);

つまり、時間文字列をパディングします。時間文字列バッファーではなく、フォーマット文字列にスペースを追加するだけです。

于 2011-02-18T11:58:00.443 に答える
1

これを例にとると、 ctime が返すもの - Sat May 20 15:21:51 2010は 24 文字 (つまり、24 バイト) です。したがって、配列インデックスは0 から 23まで開始します。したがって、インデックス 24 には終了文字があります。

したがって、間違っていTIMESTRING[24]=' ';ます (つまり、終了文字をスペース文字に置き換えています)。後の段階でセグメンテーション違反を引き起こしています。

于 2011-02-18T12:01:07.873 に答える