 memcpy関数は、バッファ間で指定のバイト数だけコピーを行いますが、VS2005では
セキュリティ強化バージョンのmemcpy_s関数を利用します。
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