をクリアする私は(この例では、初期化時)0
でchar[]
を埋めるために二つの異なる方法を見てきました:は適切に配列
/* method 1 */
char foo[1024] = {0};
/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));
2つのコード間の主な違いは何ですか?彼らはどのように機能などが異なっていますか?
をクリアする私は(この例では、初期化時)0
でchar[]
を埋めるために二つの異なる方法を見てきました:は適切に配列
/* method 1 */
char foo[1024] = {0};
/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));
2つのコード間の主な違いは何ですか?彼らはどのように機能などが異なっていますか?
2つのコード間の主な違いは何ですか?
それはがを初期化持っように、ケース1では配列は、それが使用することができた瞬間からゼロにされます。
ケース2の場合、その内容は、memset()
の呼び出しの後でのみ明確に定義されます。
本質的な違いは、ケース2の場合、foo
の内容が「ゴミ」であるというギャップがあることです。このような場合、方法1 1.
したがって、 'memset(foo、...)'は'foo = {0}'とまったく同じ方法で '0'配列を作成しますか? –
"*** in **全く同じ方法*"コンパイラが何をするのかわからないが、結果は同じである。 – alk
\ * "**全く同じように" –
第1の方法は、ゼロがすべてのメンバーを初期化するので、一般的に優れています。 Memの値を0に設定しても、特に浮動小数点およびポインタのメンバの場合はゼロ初期化と同じになるとは限りません。
パフォーマンスは賢明ですが、どちらが速いのか分かりませんが、測定する必要があります。ちなみに、'\0'
の代わりに0
をmemsetに使用できます。
memset(foo, 0, sizeof(foo));
浮動小数点ゼロなどの配列を初期化してもすべてのビットが0にならない場合の例を挙げることができますか? IEEE 754の浮動小数点ゼロは、0に設定されたすべてのビット(または符号ビットが1に設定)によって表されます。 –
@DavidBowling私はあなたの意見に同意します。この質問に答えながら、私は0だけでなく、浮動小数点値を考慮しませんでした。たとえば、9.0です。 Javaでは、時々私は9.0が8.999999999999999と見なされているのを見ました....したがって、浮動小数点値の初期化にmemset(私によると)を使うのはちょっと危険です。 –
私はここで浮動小数点値について完全には確信していませんが、これは悪い考えではありません。しかし、 'NULL'ポインタの配列を初期化する限り、' NULL'マクロは実装定義されているので、 'memset()'で初期化子を選択することは良い考えです。興味深い点。 –
/* method 1 */
char foo[1024] = {0};
には当てはまらない、アレイの設定はリテラルから、通常、プログラムのロード時に発生するのみの「スコープ」にエントリごとに一度発生することができ配列。方法2における
/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));
、アレイの設定は、実行時に発生し、ランタイムCPUサイクルを消費し、必要に応じて何度でも起こり得ます。
これら2つのコードの効果は同じです。おそらくコンパイラはどちらの場合も同じアセンブリを生成します。しかし、最初のものは読みやすく、維持しやすいです。
間違った長さのデータを間違って最初のデータで書き込むことはできません。
さらに、= { 0 };
イディオムは、すべての名前の配列や構造体を初期化するために使用することができます。整数はポイントが0.0
を取得し、フローティング、0
値を取得し、ポインタはNULLポインタを取得します。 memset
バージョンでは、これら3つのうちの最初のものだけが保証されています。
携帯用のコードを書く場合は、とにかく= { 0 }
を使用する必要があります。毎回それを使用する場合もあります。
私は最初からNULLポインタについて確信していましたが、浮動小数点数の初期化子の問題については、もう一度考えていきました。あなたと@ワシアマドは良い点を挙げました。これが私が好きな理由の一つです。常に何か新しいことを学ぶ:) –
「機能がどのように違いますか」*どの機能を参照していますか? – alk
@alk彼らはまったく同じ最終目標を達成していますか?そうでない場合、違いは何ですか? –
はい、 'memset'の呼び出しの後で、ケース2の' foo'は、ケース1の 'foo'と同じ内容、つまりすべて' 0'を運びます。 – alk