time.h から timeval 構造体を再初期化するにはどうすればよいですか?
構造体の両方のメンバーをゼロにリセットできることは認識していますが、見落としている他の方法はありますか?
任意の(おそらく集約)タイプをゼロ初期化するための完全に正しく移植可能な(C99ではありますが)方法:
myTime = (struct timeval){0};
これは、実装が null ポインターと浮動小数点ゼロの表現としてすべてゼロのビットを使用しない場合でも、ポインターと浮動小数点メンバーを含む構造体に対しても機能します。
memset
たまたまあなたのプラットフォームで動作するかもしれませんが、実際には推奨される (移植可能な) アプローチではありません...
これは:
struct timeval myTime;
myTime = (struct timeval){ 0 };
memset
のすべての要素がstruct timeval
、プラットフォーム上ですべてゼロのビット パターンによって表されるゼロの値を持つためです。
しかし、これは仕様では要求されていません。特に、POSIX ではtime_t
型が整数である必要はなく、C では浮動小数点ゼロをすべてゼロのバイトとして表す必要はありません。
初期化構文を使用すると、構造体のフィールドが整数、浮動小数点、ポインター、またはその他の構造体であるかどうかにかかわらず、構造体のフィールドが適切にゼロに設定されることが保証されます...それらの表現がメモリ内ですべてゼロではない場合でも。同じことは一般には当てはまりませんmemset
。
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 以外のコンパイラで動作することです。
ワンライナーを探している場合は、 memset to the job も使用できると思います:
struct timeval myTime;
/* snip ... myTime is now initialized to something */
memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
を使用してmemset
、プラットフォーム固有のメンバーをゼロにすることもできます。