memcpy関数は、バッファ間で指定のバイト数だけコピーを行いますが、VS2005では
セキュリティ強化バージョンのmemcpy_s関数を利用します。
void *memcpy( void *dest, const void *src, size_t count ); errno_t memcpy_s( void *dest, size_t sizeInBytes, const void *src, size_t count );destは、コピー先のバッファ、srcはコピー元バッファ、countはコピーするバイト数です。sizeInButesは、コピー先バッファのサイズです。
では、簡単なサンプルを見てみましょう。
/* memcpy01.c */
#include <stdio.h>
#include <memory.h>
#include <string.h>
int main()
{
int array1[10], array2[10], i;
struct _tagx {
int a;
char name[9];
} x, y;
for (i = 0; i < 10; i++)
array1[i] = i;
memcpy(array2, array1, sizeof(int) * 10);
for (i = 0; i < 10; i++) {
printf("array1[%d] = %d, array2[%d] = %d\n", i, array1[i], i, array2[i]);
}
printf("\n");
memcpy_s(array2, sizeof(int) * 10, array1, sizeof(int) * 10);
for (i = 0; i < 10; i++) {
printf("array1[%d] = %d, array2[%d] = %d\n", i, array1[i], i, array2[i]);
}
printf("\n");
x.a = 100;
strcpy_s(x.name, (rsize_t)sizeof(int) * 9, "abc" );
memcpy(&y, &x, sizeof(x));
printf("y.a = %d, y.name = %s\n", y.a, y.name);
memcpy_s(&y, sizeof(y), &x, sizeof(x));
printf("y.a = %d, y.name = %s\n", y.a, y.name);
}
このプログラムでは、memcpyとmemcpy_sの両方の関数を使って結果が同じであることを確かめています。最初に、array1配列に0から9までの整数値を代入して、memcpy関数でarray2にコピーしています。
次に、同じことをmemcpy_s関数を使って行っています。
また、xという構造体を用意してx.aに100を、x.nameに"abc"を格納しています。 これをmemcpyとmemcpy_s関数を利用してyにコピーしています。
実行結果は次のようになります。
当たり前ですが、どちらの関数を使っても結果は同じです。
Update Sep/02/2007 By Y.Kumei