次のような構造体があるとします。
struct A
{
int x;
int y;
};
違いは何ですか
A a = {0};
と
A a;
memset(&a,0,sizeof(A));
なし。最終的な結果は、両方とも構造体メンバーを に初期化すること0
です。
C99 標準 6.7.8.21
集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が配列内の要素よりも少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。
あなたの構造A
は集合体であり、上記のルールが適用されます。したがって、すべての構造体メンバーは、静的ストレージ期間と同じ値で初期化されます。です0
。
C99 標準 7.21.6.1 memset 関数:
void *memset(void *s, int c, size_t n);
関数 memset は、
c
(unsigned char に変換された)の値をn
、 が指すオブジェクトの最初の各文字にコピーしますs
。
簡単に言えば、構造体のオブジェクトの配置/パディング ビットを含むすべてのメンバーA
が に設定され0
ます。
C の 2 つのコンストラクトの唯一の違いは、配置/パディングも に設定することですが、集約の初期化では、構造体メンバーが に設定されることのみが保証されることに注意してください。memset
0
0
どちらの場合でも、慣習的な言語構造を介してアライメント/パディング バイトにアクセスできないため、どちらも同じ効果が得られます。
どちらもメモリを0に設定しています
1 つ目は、静的割り当てメモリのみを 0 に設定するために使用されます。
A a ={0}; // set a staic memory to 0
そして、あなたはこの方法でそれを行うことができませんでした:
A *a = malloc(sizeof(A)); a = {0} // This could not be done
2 番目は、動的割り当てメモリと静的割り当てメモリの両方を 0 に設定するために使用されます。
A a;
memset(&a,0,sizeof(A));
そして、あなたもできる
A *a = malloc(sizeof(A)); memset(a,0,sizeof(A));
別物
を使用memset
してメモリを に設定すると0
、ここで関数が呼び出されます (これには時間がかかります)。で設定すると{0}
、関数は呼び出されません。したがって、{0}
よりも高速になる可能性がありますmemset