OSX 上の Linux 用に設計された (と私は信じています) コードをコンパイルすると、エラーが発生します。この問題をコードのこのセクションまで追跡しました。
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';
fprintf(LOG, "[ %20s] ", TIMESTRING);
これが当てはまる理由はありますか?を含め<time.h>
ました。
OSX 上の Linux 用に設計された (と私は信じています) コードをコンパイルすると、エラーが発生します。この問題をコードのこのセクションまで追跡しました。
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';
fprintf(LOG, "[ %20s] ", TIMESTRING);
これが当てはまる理由はありますか?を含め<time.h>
ました。
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);
つまり、時間文字列をパディングします。時間文字列バッファーではなく、フォーマット文字列にスペースを追加するだけです。
これを例にとると、 ctime が返すもの - Sat May 20 15:21:51 2010は 24 文字 (つまり、24 バイト) です。したがって、配列インデックスは0 から 23まで開始します。したがって、インデックス 24 には終了文字があります。
したがって、間違っていTIMESTRING[24]=' ';
ます (つまり、終了文字をスペース文字に置き換えています)。後の段階でセグメンテーション違反を引き起こしています。