memset()関数詳細(タグメモ)

3113 ワード

#include <string.h>
  void *memset( void *buffer, int ch, size_t count );

機能:関数はchをbufferの最初からcount文字にコピーし、bufferポインタを返します.memset()は、メモリを値に初期化するために適用できます.例:
    memset( the_array, '/0', sizeof(the_array) );

これは配列のため成分をゼロに設定する便利な方法です.
簡単な例:
#include #include main(void) { char buffer[] = "Hello world/n"; printf("Buffer before memset: %s/n", buffer); memset(buffer, '*', strlen(buffer) ); printf("Buffer after memset: %s/n", buffer); return 0; } 
 
また、必ずしもコンテンツがchで指定されたASCII値に設定されているとは限らず、そこのchはintまたは他のタイプであってもよく、必ずしもcharタイプであるとは限らない.たとえば、次のようになります.
  int array[5] = {1,4,3,5,2};
  for(int i = 0; i < 5; i++)
  cout<  cout<  memset(array,0,5*sizeof(int));
  for(int k = 0; k < 5; k++)
  cout<  cout<出力の結果は次のとおりです.
  1 4 3 5 2
  0 0 0 0 0
 
後のテーブルサイズのパラメータはバイト単位なので、intやその他に対してデフォルトの1(文字型)を乗じているわけではありません.またマシンによってintの大きさが異なる場合もあるのでsizeof()を使用したほうがいいです.
注意したいのは、memsetはバイトを操作します!
だから上記のプログラムを
  int array[5] = {1,4,3,5,2};
  for(int i = 0; i < 5; i++)
  cout<  cout<  memset(array,1,5*sizeof(int));//ここは上のプログラムとは違いますのでご注意ください
  for(int k = 0; k < 5; k++)
  cout<  cout<出力の結果は次のとおりです.
  1 4 3 5 2
  16843009 16843009 16843009 16843009 16843009
どうしてですか.
memsetはバイト単位でarrayが指すメモリの4バイトに割り当てられているため、それぞれASCIIが1の文字で埋められ、バイナリに移行すると1は00000001で1バイトを占めています.1つのINT要素は4バイトで、合わせて1つのINT要素に対する割り当てが完了しました.
だからmemsetで非文字型配列に初期値を割り当てるのは望ましくない!
例えば構造体Some xがあり、このようにゼロにすることができます.
  memset( &x, 0, sizeof(Some) );
構造体の配列Some x[10]の場合、次のようになります.
  memset( x, 0, sizeof(Some)*10 );
 
 
以下は、lemurにおけるTermCacheを見てmemset(_cacheTerm,0 xff,sizeof(_cacheTerm))メモリ初期化後、HashTableにおけるtermid初期は-1の原因であり、以下のようにテストされる(HashTableは与えられず、構造体caheTerm[CACHE_SIZE]の初期化のみをテストする.
#include using namespace std; #define STR_MAXLEN 12 #define CACHE_SIZE 64*1024*1024 struct cache_term{ char term[STR_MAXLEN]; int id; }; struct cache_term _cacheTerm[CACHE_SIZE/sizeof(struct cache_term)]; ポイントmain(){cout<