最近、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。