4

新しいことをするために古いプログラムを書き直していますが、突然、次のコード行でセグメンテーション違反エラーが発生します。

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) への呼び出しが原因でセグメンテーション違反が発生したとは思いません..しかし、私は実際に何が起こったのかはまだわかりません。とにかく、問題は解決しました。みんなありがとう。

4

6 に答える 6

4

コンパイラがそれをNULLポインタ#include <time.h>に変換する必要があることを知っている場合。0それ以外の場合は、関数にを渡しintます。

私はあなたの実装がとは(int)0異なって扱われると思います(time_t*)0

だから...追加

#include <time.h>

あなたのコードに

編集

これを試して

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

int main(void) {
    printf("size of (int): %d\n", (int)sizeof (int));
    printf("size of (time_t*): %d\n", (int)sizeof (time_t*));
    return 0;
}
于 2009-11-13T21:25:37.727 に答える
4

おそらく、スタック フレームに途方もなく大きなオブジェクトがあり、スタックをオーバーフローしていませんか? これがどのように発生するかの詳細な例と状況の分析については、このブログ投稿を参照してください。time(2)関数はそれNULLに渡すことができ、time()実装にバグがある可能性はほとんどありません。

于 2009-11-13T20:50:48.530 に答える
3

多くの場合、セグメンテーション違反が間違った行でキャッチされることに気付くでしょう。その周りの線は何ですか?それらのいずれかが原因である可能性はありますか?

標準ライブラリの time 関数は引数として time_t * を取りますよね?したがって、segfault が発生しても > 驚くべきことではありません: NULL ポインタを逆参照しようとしているのです!

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

参照を参照してください。

于 2009-11-13T20:51:46.583 に答える
1

timeプログラムに、標準ライブラリの関数と衝突するという名前の変数またはローカル関数が含まれている可能性はありますtimeか?

于 2009-11-13T21:27:09.973 に答える
0

Adam Rosenfield が指摘したように、スタック スペースが不足している場合、プログラムは (システム コールだけでなく) 任意の関数を呼び出した時点でセグメンテーション違反を起こす可能性があります。

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

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

ulimit -S unlimited
于 2016-04-20T08:04:51.623 に答える
-1

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

time(NULL);
time(((void*)0));

ゼロじゃない?

于 2009-11-13T20:48:23.883 に答える