質問は変わり続けるので、私は次のように定義します。
1:memset( buffer, '\0', sizeof(buffer) );
2a:memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH );
2b:memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH );
3:memset( buffer, '\0', ARRAY_LENGTH );
質問が単に「memset
この配列をゼロにする最良の方法は何か」ではなく「正しい呼び出し方法は何か」である場合は、2b または 3 のいずれかが正しいです。1と2aは間違っています。
2b と 3 をめぐってスタイル戦争をすることができます: を含めるかどうかsizeof(char)
-- 冗長だから除外する人もいれば (私は通常そうします)、同じコード設定で一種の一貫性を持たせるためにそれを入れる人もいます。の配列int
。つまり、サイズが1であることを知っていても、常にサイズに要素数を掛けます。考えられる結論の1つは、が指す配列をmemsetする「最も安全な」方法buffer
は次のとおりです。
std::memset(buffer, 0, sizeof(*buffer) * ARRAY_LENGTH);
このコードは、バッファのタイプが変更されても、もちろん、それがARRAY_LENGTH
どのようなタイプの要素でもあり続け、すべてのビットがゼロであり、正しい初期値のままである限り、正しいままです。
「C++ は C ではない」プログラマーに好まれるもう 1 つのオプションは、次のとおりです。
/* never mind how buffer is allocated */
std::fill(buffer, buffer + ARRAY_LENGTH, 0);
気にする場合は、コンパイラが への同等の呼び出しを最適化するのと同じコードにこれを最適化するかどうかを自分で確認できますstd::memset
。
char *buffer = new char [ARRAY_LENGTH]();
new
は気の利いたものですが、そもそも配列を割り当てることはほとんどないため、実際には C++ ではほとんど役に立ちません。
std::string buffer(ARRAY_LENGTH, 0);
バッファを管理する特定の方法を紹介します。これは、必要な場合とそうでない場合がありますが、多くの場合はそうです。char buffer[ARRAY_LENGTH] = {0};
場合によっては、言いたいことがたくさんあります。