Menu

Category

Archive

logo


memcpy(), memcmp(), memset()

2014-05-20 15:00:00 +0900
  • このエントリーをはてなブックマークに追加

最近、C を書いてます。その中で勉強したことのメモ。

memcpy()

文字列、つまり、char の配列をコピーするには、strcpy() を使うのはよく知られていますが、それ以外に配列をコピーする際に便利な memcpy() がある。この関数も string.h の中に宣言されています。この memcpy() は、strcpyと3つ目の引数を取ること以外はほとんど同じです。3つ目の引数に、コピーするバイト数を渡す必要があります。例えば、int型の配列をコピーする際には、

1
2
3
4
int a1[10] = {1, 3, 5, 7, 9 , 11};
int a2[10]; 

memcpy(a2, a1, 10 * sizeof(int));

のようにします。

1
memcpy(a2, &a1[5], 5 * sizeof(int));

コピーされる配列(a1)の要素のアドレスを渡し、そこからコピーを開始はこんな感じ。

1
memcpy(folks1, folks2, 3 * sizeof(struct person));

構造体を使用する場合も同じ。

memcmp()

これも文字列の比較で使われる strcmp の他のデータ型にも対応した関数。これも使い方はほとんど同じ。

1
2
3
4
int a1[5] = {1, 3, 5, 7, 9};
int a2[5] = {1, 3, 5, 8, 9};

memcmp(a, b, 5 * sizeof(int));

この例では、ネガティブな結果を返します。(7 - 8) 文字列比較の場合には、ASCIIコードにより比較されていましたが、文字列でない int型の比較の場合には、バイトの整数値での比較結果を返します。

memset()

mem ファミリーに memset という関数もあります。これは、初期化する際に使われることが多いです。

1
memset(&records[100], 0, sizeof(struct recode));

records という構造体の101個の要素を持っている配列があると仮定して、最後の要素をゼロアウトし、センティネルとして使用したい時には、これでOK。