memset で検索して来られる方へ

どういうわけか、連日のように memset または memset を含むフレーズで検索して来られる方が大勢いらっしゃいます。そして、そうした方々の直帰率は 80% を超えています。おそらく、何か別の情報を期待しておられたのでしょうね。

というわけで、今回は、memset を含むフレーズで検索して来られる方のために、おそらく期待しておられたのであろう情報を公開することにします。

まずは、memset の一般的な解説からです。memset は、C/C++ で共通に使える標準関数です。使用するには、<string.h> をインクルードする必要があります(C++ では、<cstring> でもかまいません。その場合は、std::memset になります)。

memset は、指定したデータ領域の全バイトを、指定した文字で埋めます。関数の形式は次のとおりです。

void *memset(void *s, int c, size_t n);

第1引数 s には、更新対象となるバイト列の先頭要素へのポインタを指定します。第2引数 c には、バイト列の各バイトに設定すべき値を 0 ~ UCHAR_MAX の範囲で指定します。第3引数 n には、バイト列のバイト数を指定します。返却値は常に s です。

memset の第1引数は void* ですので、どんな型のデータ領域でも指定できますが、汎整数型以外の型が含まれる場合、期待した結果になるとは限りません。例えば、浮動小数点型やポインタ型が含まれるデータ領域を 0 で埋めたとしても、0.0NULL になるかどうかは処理系に依存します。C++ では、C 互換型(POD 型)以外を含むデータ領域に対して、memset を使った場合、未定義の動作を引き起こします。

ちなみに、C/C++ には、wchar_t 型単位でデータを埋める wmemset 関数というのもあります。この関数を使うには、<wchar.h> をインクルードします(C++ では、<cwchar> でもかまいません。その場合は std::wmemset になります)。wmemset の形式は次のようになります。

wchar_t *wmemset(wchar_t *wcs, wchar_t wc, size_t n);

ところで、C++ の場合には、もう少し使い勝手のよい std::fill 関数テンプレートと std::fill_n 関数テンプレートがあります。

namespace std {

template<class ForwardIterator, class T>
  void fill(ForwardIterator first, ForwardIterator last, const T& value);

template<class OutputIterator, class Size, class T>
  void fill(OutputIterator first, Size n, const T& value);

}

これらの関数テンプレートを使うには、<algorithm> をインクルードする必要があります。

std::fill または std::fill_n 関数テンプレートを使えば、浮動小数点型やポインタ型が含まれていても問題ありませんし、C 互換型以外が含まれていても問題ありません。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/163
このエントリーを含むはてなブックマーク