3


0

私はいくつかの新しいことをするために古いプログラムを書き直しています、そして突然私は次のコード行でセグメンテーションフォールトエラーを得ます:

time_t seconds_since_time_begun = time(0);

なんで、なんで?

*更新:*私は自分のコードにtime.hヘッダファイルを含めました、そして、pmgが以下に提案するものを試したとき、両方の変数は4つのサイズでした。

私が次のことを試したとき:

printf( "4 \ n");
// time_t seconds_since_time_begun = time(0);
printf( "5 \ n");

たとえtime()が呼ばれている行がコメントアウトされていても、 "4"が印刷された直後はまだセグメンテーション違反になります。 "5"は出力されません。 これはどのように可能ですか?

*アップデート2:*コードのどこでエラーが発生したのかを特定するために、ステップバイステップで関数を再構築したところ、問題が発生したと思います。 何が間違っていたのかわかりませんが、整数配列値と0の比較に関係しています。 だから、私はセグメンテーション違反がtime(0)への私の呼び出しによって引き起こされたとは思わない。 しかし、実際に何が起こったのかはまだわかりません。 とにかく、問題は解決しました。 みんなありがとう。

6 Answer


4


たぶんあなたはあなたのスタックフレームにスタックをあふれているとんでもないラージオブジェクトがありますか? それがどのように起こり得るかの詳細な例と状況の分析については このブログ記事を参照してください。 time(2)関数はそれに NULL`を渡すことを可能にします、そしてそれはあなたの time() `実装がバグを持っていることはほとんどありません。


4


#include`があれば、コンパイラはその 0`をNULLポインタに変換する必要があることを知っています。 そうでなければ、それは関数に `int`を渡します。

あなたの実装は (int)0`を(time_t *)0`とは違う方法で扱うと思います。

そう …​ 追加する

#含める

あなたのコードに

編集

これを試して

#include #include

int main(void){printf( "size of(int):%d \ n"、(int)sizeof(int)); printf( "(time_t *)のサイズ:%d \ n"、(int)sizeof(time_t *)); 0を返します。 }


3


多くの場合、セグメンテーション違反が誤った行で検出されることがわかります。 その周りの線は何ですか? それらの1つが原因である可能性がありますか?

_ 標準ライブラリの時間関数は、引数としてtime_t *を取りますよね? それゆえ、あなたがセグメンテーション違反を起こすことは>驚くことではない:あなたはNULLポインタを間接参照しようとしている! _

time(0)またはtime(NULL)は、time関数を使用して現在時刻にアクセスするための標準的で一般的な方法です。


1


あなたのプログラムが標準ライブラリの time`関数と衝突する time`という名前の変数やローカル関数を含んでいる可能性はありますか?


0


Adam Rosenfieldによって指摘されているように、プログラムは、それがスタック空間の外にあるとき、(システムコールだけではなく)あらゆる関数を呼び出すという点でセグメンテーションフォールトになるかもしれません。

さて、あなたのプログラムは実際にはヒープではなくスタックに巨大なデータを格納する必要があるかもしれません。 この場合の解決策は、特定の環境の最大スタックスペースを変更することです。

Linuxでは、 ulimitを使用して変更できます。

ulimit -S無制限


-1


素敵ですが、時間(time_t * t)としてNULLポインタを渡すつもりでしたか?

時間(NULL)。 time(((void *)0));

ゼロではない?