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
また、必ずしもコンテンツがchで指定されたASCII値に設定されているとは限らず、そこのchはintまたは他のタイプであってもよく、必ずしもcharタイプであるとは限らない.たとえば、次のようになります.
int array[5] = {1,4,3,5,2};
for(int i = 0; i < 5; i++)
cout<
for(int k = 0; k < 5; k++)
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<
for(int k = 0; k < 5; k++)
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