11

time.h から timeval 構造体を再初期化するにはどうすればよいですか?

構造体の両方のメンバーをゼロにリセットできることは認識していますが、見落としている他の方法はありますか?

4

5 に答える 5

15

任意の(おそらく集約)タイプをゼロ初期化するための完全に正しく移植可能な(C99ではありますが)方法:

myTime = (struct timeval){0};

これは、実装が null ポインターと浮動小数点ゼロの表現としてすべてゼロのビットを使用しない場合でも、ポインターと浮動小数点メンバーを含む構造体に対しても機能します。

于 2011-06-24T01:12:56.737 に答える
4

memsetたまたまあなたのプラットフォームで動作するかもしれませんが、実際には推奨される (移植可能な) アプローチではありません...

これは:

struct timeval myTime;

myTime = (struct timeval){ 0 };

memsetのすべての要素がstruct timeval、プラットフォーム上ですべてゼロのビット パターンによって表されるゼロの値を持つためです。

しかし、これは仕様では要求されていません。特に、POSIX ではtime_t型が整数である必要はなく、C では浮動小数点ゼロをすべてゼロのバイトとして表す必要はありません。

初期化構文を使用すると、構造体のフィールドが整数、浮動小数点、ポインター、またはその他の構造体であるかどうかにかかわらず、構造体のフィールドが適切にゼロに設定されることが保証されます...それらの表現がメモリ内ですべてゼロではない場合でも。同じことは一般には当てはまりませんmemset

于 2011-06-24T01:15:00.920 に答える
1

struct timeval浮動小数点型であるか整数型であるかに関係なく、また浮動小数点型のゼロ表現に関係なく、構造体をゼロ値に再初期化する必要があると仮定すると、C90 以降または C++ で機能するメソッド:

static struct timeval init_timeval;  // or whatever you want to call it

// ...

myTime = init_timeval;

R.'s answerおよびNemo's answer のように、これは表現方法に関係なく NULL ポインターも処理します。なぜ astruct timevalがポインターを持つのか想像できませんが、この手法は 以外の構造体に役立つため、これについて言及しstruct timevalます。

他の回答と比較した場合の欠点は、静的変数またはグローバル変数をどこかに定義する必要があることです。利点は、C99 以外のコンパイラで動作することです。

于 2011-06-24T02:18:31.213 に答える
0

ワンライナーを探している場合は、 memset to the job も使用できると思います:

struct timeval myTime;

/* snip ... myTime is now initialized to something */

memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
于 2011-06-24T00:26:09.173 に答える
-2

を使用してmemset、プラットフォーム固有のメンバーをゼロにすることもできます。

于 2011-06-24T00:24:42.157 に答える